5
1

More than 1 year has passed since last update.

Rのdplyrやggplot2で列の名前を変数で指定する方法(specify dynamic column name by variable in dplyr and ggplot2)

Last updated at Posted at 2022-02-10

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

おわり

おわりです。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1