小编bos*_*hek的帖子

当你有一个额外的变量时,在R中循环以创建许多图

我经常面对的数据有太多的分类变量,无法令人满意地绘制到一个图上.当出现这种情况时,我会写一些东西来循环变量并保存几个特定于该变量的图.

以下示例说明了此过程:

library(tidyr)
library(dplyr)
library(ggplot2)

mtcars <- add_rownames(mtcars, "car")

param<-unique(mtcars$cyl)
for (i in param)
{
mcplt <- mtcars %>% filter(cyl==i) %>% ggplot(aes(x=mpg, y=hp)) +
    geom_point() +
    facet_wrap(~car) +
    ggtitle(paste("Cylinder Type: ",i,sep=""))
  ggsave(mcplt, file=paste("Type",i,".jpeg",sep=""))
}
Run Code Online (Sandbox Code Playgroud)

每当我看到在线参考循环时,每个人似乎总是表明循环通常不是R中的好策略.如果是这种情况,任何人都可以推荐一种更好的方法来实现与上面相同的结果吗?我特别感兴趣的是像SOOOO这样的循环更快的东西.但也许解决方案是这是最好的解决方案.如果有人能改进这一点,我只是很好奇.

提前致谢.

loops r ggplot2

5
推荐指数
1
解决办法
1484
查看次数

使用ggplot2进行演示的主题

我目前的任务是制作一个情节丰富的演示文稿.我自然会准备好所有的情节ggplot2.我喜欢Hadley的默认设置,因为它们在屏幕和印刷品上看起来都很精彩.通常我也会使用投影仪或平板电视将这些默认值用于演示.但是,我想知道在投影环境中哪些其他选项可能看起来不错?具体来说,我想知道我是否可以利用这里的集体知识来查看theme()其他人在准备情节时用于演示目的的选项ggplot2.

对于带投影的演示文稿,建议使用哪些主题设置?你如何实现这些设置ggplot2

如果您推荐主题存储库,我也很感激参考.

r ggplot2

5
推荐指数
1
解决办法
1044
查看次数

保留字符串后的第一个数字

这似乎应该很容易,但我无法弄清楚正则表达式匹配的哪个排列将导致在第一个数字提取整个字符串(如果是字符串).我可以在第一个数字之前提取字符串,如下所示:

gsub( "\\d.*$", "", "DitchMe5KeepMe" )
Run Code Online (Sandbox Code Playgroud)

任何想法如何编写正则表达式模式,以保持第一个数字后的字符串?

regex r

5
推荐指数
1
解决办法
1980
查看次数

为什么R持有修改excel文件的权限?

我正在循环中读取一些excel数据到R中,因为我有一堆文件.这是我经常做的事情.我遇到了一些麻烦,我甚至不确定如何制作可重复的例子.所以我在一个目录中拥有了我想要的所有文件,并且我正在使用这组命令读取它们:

## Because I want warnings to stop the loop at a certain file so I can diagnose
options(warn=2)
xl_load_in <- c()
for (x in list.files(pattern="*\\.xls")) {
  cat(x, "\n ")
  u <- read_excel(x,col_types=c("text","text","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","text"))
  xl_load_in <- tbl_df(rbind(xl_load_in, u))
}
options(warn=0)
Run Code Online (Sandbox Code Playgroud)

因此,这既是读取文件的工具,也是使用warn切换,我可以诊断哪些文件没有正确读取.

现在的问题是:从重新启动,我可以重命名并保存目录中的excel文件.但是,如果我运行上面的R代码,我将失去保存或重命名循环中断的excel文件的权限(excel文件存在小问题,必须手动纠正).例如,如果我尝试重命名循环中断的文件,我会收到此窗口错误:

由于文件在RStudio R Session中打开,因此无法完成操作.

如果我重新启动,我可以再次修改有问题的文件.但在重新启动之前,我无法保存或重命名该文件.任何人都可以解释这种行为R或Rstudio似乎接管我的权限?

更新如果我关闭RStudio,则返回权限.如果我使用RGUI for Windows执行上述相同的命令序列,则表示问题的复制问题不是RStudio问题.

sessionInfo()

R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United …
Run Code Online (Sandbox Code Playgroud)

windows permissions excel r

5
推荐指数
0
解决办法
305
查看次数

read_excel 读入消息 - 抑制?

我喜欢使用这个readxl包。但是,我一直将它用作 RMarkdown 文档的一部分,并且read_excel()读取文件时的一些消息在进行分析时很有用,但在尝试呈现分析时则不然。所以问题是,有什么方法可以在使用时抑制收到的消息(或与此相关的任何警告消息)read_excel?我将采用 RMarkdown 或 read_excel 解决方案。

以下是我想要抑制的消息类型的说明。出现在我的最终 Rmarkdown 文档中:

## Parsed with column specification:
## cols(
##   .default = col_character(),
##   Year = col_integer(),
##   Month = col_integer(),
##   Date = col_date(format = ""),
##   Day = col_integer(),
##   Replicate = col_integer(),
##   Time = col_integer(),
##   Depth = col_double(),
##   DenTotal = col_integer()
## )
## See spec(...) for full column specifications.
Run Code Online (Sandbox Code Playgroud)

我无法找到一种方法从 url 中读取 excel 文件,read_excel因此我无法在此处制作可重现的示例。

r r-markdown readxl

5
推荐指数
1
解决办法
6128
查看次数

使用 RSQLite 时,数据库中的日期数据会发生什么?

我已经开始使用 RSQLite 和 dplyr 来有效地处理大型数据集。但是,我一直无法协调如何让 RSQLite 格式化日期或这里有哪些最佳实践。下面的例子应该说明这个过程对我来说在哪里失败:

library(tidyverse)
library(RSQLite)
Run Code Online (Sandbox Code Playgroud)

数据

日期格式正确

date=seq(as.Date("1910/1/1"), as.Date("1911/1/1"), "days")
x=rnorm(length(date))
df1 <- tibble(date, x)
df1

# A tibble: 366 × 2
date           x
<date>       <dbl>
  1  1910-01-01  1.72459562
2  1910-01-02  0.88216253
3  1910-01-03 -0.35434587
4  1910-01-04 -0.63401467
5  1910-01-05  0.18136909
6  1910-01-06 -0.09513488
7  1910-01-07 -1.03252313
8  1910-01-08  0.40924962
9  1910-01-09  0.90759866
10 1910-01-10  0.60456596
# ... with 356 more rows
Run Code Online (Sandbox Code Playgroud)

创建数据库

dbname = "test.sqlite3"
con <- dbConnect(SQLite(), dbname)
Run Code Online (Sandbox Code Playgroud)

将 df1 添加到数据库

dbWriteTable(con, "test", df1, …
Run Code Online (Sandbox Code Playgroud)

sqlite r rsqlite

5
推荐指数
1
解决办法
991
查看次数

在ggraph中使用经纬度数据进行布局时出现问题

我试图弄清楚如何在其中使用经/纬度布局,ggraph但似乎无法通过语法正常工作。考虑此reprex,并从iris数据集中修改了一些数据:

data <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
5, 4.4, 4.9, 5.4, 4.8), Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 
3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4), Lon = c(-122.683, -122.688, 
-122.686, -122.683, -122.678, -122.675, -122.674, -122.673, -122.676, 
-122.674, -122.677, -122.68), Lat = c(45.523, 45.52, 45.514, 
45.515, 45.513, 45.514, 45.517, 45.519, 45.519, 45.522, 45.524, 
45.521)), class = "data.frame", .Names = c("Sepal.Length", "Sepal.Width", 
"Lon", "Lat"), row.names = c(NA, -12L))

library(ggplot2)
library(igraph)
library(ggraph)
Run Code Online (Sandbox Code Playgroud)

坐标位置的简单图如下所示: …

r igraph ggraph

5
推荐指数
1
解决办法
580
查看次数

在保留组的同时填充数字变量

[编辑反映更好的例子]

假设我有一个这样的数据帧:

df <- data.frame(x = c("A","A","B", "B"), year = c(2001,2004,2002,2005))

> df
  x year
1 A 2001
2 A 2004
3 B 2002
4 B 2005
Run Code Online (Sandbox Code Playgroud)

如何year在保留的同时增加1 x?我想填写,year以便序列是这样的:

  x year
1 A 2001
2 A 2002
3 A 2003
4 A 2004
5 B 2002
6 B 2003
7 B 2004
8 B 2005
Run Code Online (Sandbox Code Playgroud)

任何人都可以推荐这样做的好方法吗?

@useR推荐这种方法:

> data.frame(year = min(df$year):max(df$year)) %>%
   full_join(df) %>%
   fill(x) 
Joining, by = "year"
  year x
1 2001 A
2 …
Run Code Online (Sandbox Code Playgroud)

r dataframe dplyr tidyverse

5
推荐指数
1
解决办法
54
查看次数

如果值低于阈值,则与相邻组聚合

我试图找出一种方法来聚合组的级别,根据您正在聚合的阈值创建一个新级别。

创建一些数据:

library(tidyr)
library(dplyr)

demo_data <- as_tibble(VADeaths) %>% 
  mutate(age_bucket = row.names(VADeaths)) %>% 
  pivot_longer(-age_bucket) %>% 
  arrange(name)
Run Code Online (Sandbox Code Playgroud)

这里有一堆低于我们阈值的值(这里说 15)

demo_data %>% 
  filter(value < 15)
#> # A tibble: 5 x 3
#>   age_bucket name         value
#>   <chr>      <chr>        <dbl>
#> 1 50-54      Rural Female   8.7
#> 2 55-59      Rural Female  11.7
#> 3 50-54      Rural Male    11.7
#> 4 50-54      Urban Female   8.4
#> 5 55-59      Urban Female  13.6

Run Code Online (Sandbox Code Playgroud)

现在我可以使用一些逻辑来做到这一点,case_when但这似乎很脆弱,因为它太具体了。然而,这确实说明了我的追求:

demo_data %>% 
  mutate(age_bucket_agg = case_when(
    age_bucket %in% c("50-54", "55-59") & …
Run Code Online (Sandbox Code Playgroud)

r dplyr

5
推荐指数
1
解决办法
167
查看次数

使用 mutate 对最后一列执行操作

有没有什么方法可以引用 mutate 中的最后一列,以便您可以对其进行操作?例如:

\n
library(dplyr)\nlibrary(tidyr)\ndat <- data.frame(\n  col1 = c(1, 1, 1),\n  col2 = c(0, 1, 0),\n  col3 = c(2, 0, 2)\n)\n\n## what i was thinking:\ndat %>%\n  mutate(col1_bigger_than_col3 = col1 > last_col())\n#> Error in `mutate()`:\n#> ! Problem while computing `col1_bigger_than_col3 = col1 > last_col()`.\n#> Caused by error:\n#> ! `last_col()` must be used within a *selecting* function.\n#> \xe2\x84\xb9 See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.\n\n#> Backtrace:\n#>      \xe2\x96\x86\n#>   1. \xe2\x94\x9c\xe2\x94\x80dat %>% mutate(col1_bigger_than_col3 = col1 > last_col())\n#>   2. \xe2\x94\x9c\xe2\x94\x80dplyr::mutate(., col1_bigger_than_col3 = col1 > last_col())\n#>   3. \xe2\x94\x9c\xe2\x94\x80dplyr:::mutate.data.frame(., col1_bigger_than_col3 = …
Run Code Online (Sandbox Code Playgroud)

r dplyr

5
推荐指数
1
解决办法
515
查看次数