指定dplyr列名称

时间:2014-01-27 19:43:51

标签: r group-by columnname dplyr

如果我不知道列名,但是想通过变量指定列名,怎样才能将列名传递给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))

5 个答案:

答案 0 :(得分:19)

我刚刚在Group by multiple columns in dplyr, using string vector input给出了类似的答案,但是为了更好的衡量标准:允许您使用字符串对列进行操作的函数已添加到dplyr。它们与常规dplyr函数具有相同的名称,但以下划线结尾。这些功能在this vignette

中有详细描述

从OP获得dfsomeColumn,这现在可以实现:

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)

enter image description here

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))