web-dev-qa-db-ja.com

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

文字列ベクトル入力を使用してdplyrの複数の列でグループ化 で同様の答えを出しただけですが、適切な対策として、文字列を使用して列を操作できる関数が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であり、%>%演算子は%.%が非推奨であるため使用されていることに注意してください。

19
edward

これは、ハドレーの投稿したデュープに対する解決策を選択することで得られた、この簡単な質問に対する回答です。

gdf <- df %.% regroup( lapply( someColumn, as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

FWIW、私の使用例では、1つの変数列と1つの定数列でグループ化しました。その解決策は:

gdf <- df %.% regroup( lapply( c( 'constant_column', someColumn), as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

最後に、投稿されたevalソリューションが機能しません。それは、値がすべてsomeColumnevalsになる新しい列を作成するだけです。私はまだコメントを残したり、それを反対票を投じたりするほどクールではありません。

3
StatSandwich

次のように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
0
ashkan