19

如果我不知道列名但想通过变量指定它,如何将列名传递给 dplyr?

例如这有效:

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

5 回答 5

19

我刚刚在Group by multiple columns in dplyr 中给出了类似的答案,使用字符串向量输入,但为了更好的衡量标准:允许您使用字符串对列进行操作的函数已添加到dplyr. 它们与常规函数具有相同的名称dplyr,但以下划线结尾。此小插图中详细描述了这些功能。

鉴于dfsomeColumn来自 OP,现在这是一种享受:

gdf <- df %>% group_by_(someColumn) %>% summarise(m1=mean(V1),m2=mean(V2),m3=mean(V3))

请注意,它是group_by_,而不是group_by,并且不推荐%>%使用该运算符%.%

于 2014-10-31T05:13:43.257 回答
3

这是这个简单问题的答案,通过挑选哈德利对他发布的欺骗的解决方案获得。

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 evals to。

于 2014-02-04T20:14:09.980 回答
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
于 2015-10-21T16:42:34.537 回答
-1

在此处输入图像描述

pollutant <- "sulfate"
summarise(data, mean(eval(as.symbol(pollutant)), na.rm = TRUE))

我试图对我自己的问题提出同样的问题。然后我找到了解决方案。我用 eval(as.symbol()) 封装了表达式。

于 2014-05-16T21:49:58.040 回答
-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))
于 2014-02-02T21:04:10.263 回答