2014-01-27 45 views
18

如果我不知道列名,但是想通過變量指定它,如何將列名傳遞給dplyr?指定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)) 
+0

是可能的。我最終在dplyr鏈之前重命名了組列。像 'colnames(df)[which(colnames(df)== someColumn)] < - 「group」' – user3241888

+0

值得注意的是,'正確的'答案可能不同於dplyr 0.7.0下的解決方案。 – russellpierce

回答

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

這根本不起作用,只是增加一個名爲'eval(someColumn)'的新列,其中每行都是「group」'。 – Gregor

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解決方案不起作用。這只是一個新的列,其值都是什麼someColumneval s。我還不夠酷,不會發表評論或者降低評分。

-1

enter image description here

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

我試圖問我自己的問題,同樣的問題。然後我找到了解決辦法。 我用eval(as.symbol())封裝表達式。

+0

似乎無法與我當前版本的dplyr一起使用 – Calimo

18

我剛剛在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,並作爲%.%不推薦使用%>%操作。

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