dplyrで列名を変数で与える
Rのdplyrでデータを加工する際、summarise,filter,mutate
などの関数の中で、
加工の対象となる列名を変数で与えたいときがあります。
例えば以下のように加工する列を変数で指定して、summarise
で合計を計算する場合は、
df <- data.table(col_a = c(1,2,3),col_b=c(4,5,6))
# 加工する列の名前を変数で指定
column_name = "col_a"
# 【エラーになります】column_nameで指定した列を合計する
df %>% summarise(col_sum = sum(column_name))
と書きたくなりますが、これはエラーになります。データに"column_name"という列はありません!という。
エラーにならないためには、!!as.name( )
か、 !!sym( )
のどちらかを使って、
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name = "col_a"
df %>% summarise(col_sum = sum(!!as.name(column_name)))
df %>% summarise(col_sum = sum(!!sym(column_name)))
と書きます。
この方法であれば、dplyrの関数の中で文字列の結合で列名を作ったりもできます。
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name_1 = "a"
df %>% summarise(col_sum = sum(!!as.name(paste0("col_",column_name_1))))
例外:mutateで新しい列名を変数で与える
mutateで新しく作りたい列の名前を変数で与える場合は、下記のように書く
fuga = "aaaa"
iris %>% mutate(!!fuga := 100) %>% head
iris %>% mutate("{fuga}" := 100) %>% head
ggplot2で列名を変数で与える
グラフをggplot2
で描く際も同様に、!!as.name( )
か、 !!sym( )
で列名を変数で指定できます。
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name = "col_a"
column_name_1 = "b"
# これと
ggplot(df) + geom_point(aes(x=col_a,y=col_b))
# これは同じグラフになります
ggplot(df) + geom_point(aes(x=!!as.name(column_name),y=!!as.name(paste0("col_",column_name_1))))
なお、select,inner_join
などの一部の関数では変数に格納した列名をそのまま使えます。
そのあたりがややこしいですね。
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
#エラーにならない
column_name = "col_a"
select(df,column_name)
inner_join(df,df,by=column_name)
#エラーにならない
column_name_1 = "b"
select(df,paste0("col_",column_name_1))
inner_join(df,df,by=paste0("col_",column_name_1))
おわり
おわりです。