如果我不知道列名,但是想通过变量指定列名,怎样才能将列名传递给dplyr?
e.g。这有效:
require(dplyr)
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(group) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
但这不是
require(dplyr)
someColumn = "group"
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(someColumn) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
答案 0 :(得分:19)
我刚刚在Group by multiple columns in dplyr, using string vector input给出了类似的答案,但是为了更好的衡量标准:允许您使用字符串对列进行操作的函数已添加到dplyr
。它们与常规dplyr
函数具有相同的名称,但以下划线结尾。这些功能在this vignette。
从OP获得df
和someColumn
,这现在可以实现:
gdf <- df %>% group_by_(someColumn) %>% summarise(m1=mean(V1),m2=mean(V2),m3=mean(V3))
请注意,它是group_by_
,而不是group_by
,%>%
运算符用作%.%
已弃用。
答案 1 :(得分:3)
这是对这个直截了当的问题的回答,这个问题是通过选择hadley的解决方案获得的。
gdf <- df %.% regroup( lapply( someColumn, as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
FWIW,我的用例涉及通过一个变量列和一个常量列进行分组。解决方法是:
gdf <- df %.% regroup( lapply( c( 'constant_column', someColumn), as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
最后,发布的eval
解决方案不起作用。这只会创建一个新列,其值都是someColumn
eval
的值。我还不够冷静地发表评论或对其进行投票。
答案 2 :(得分:0)
您可以使用summarise_,如下所示:
plotVar = "Stocks_US_TotalCrudeOil"
dfBand <- mydf[ c( plotVar , "year", "week" ) ] %>%
filter ( year %in% bandYears ) %>%
group_by ( week ) %>%
summarise_ ( ymini = paste( "min(" , as.name(plotVar) ,")" )
, ymaxi = paste( "max(" , as.name(plotVar) ,")" ) )
dfBand
答案 3 :(得分:-1)
pollutant <- "sulfate"
summarise(data, mean(eval(as.symbol(pollutant)), na.rm = TRUE))
我试图针对自己的问题提出同样的问题。然后我找到了解决方案。 我用eval封装了表达式(as.symbol())。
答案 4 :(得分:-2)
我希望你只需要使用eval
require(dplyr)
someColumn = "group"
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(eval(someColumn)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))