まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

Rでloopを使って動的な名前の列を追加していきたい

目的

Rにおいて、各loop毎に異なった名前の列名を追加していきたい。

問題

変数名として解釈される前に新規列名として解釈がされる。

iris2 = iris

for (n in 1:3) {
  column_name = paste('column',n, sep = "")
  iris2 = iris2 %>% 
    mutate(column_name = n)
}
head(iris2)

# =>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species column_name
# 1          5.1         3.5          1.4         0.2  setosa           3
# 2          4.9         3.0          1.4         0.2  setosa           3
# 3          4.7         3.2          1.3         0.2  setosa           3
# 4          4.6         3.1          1.5         0.2  setosa           3
# 5          5.0         3.6          1.4         0.2  setosa           3
# 6          5.4         3.9          1.7         0.4  setosa           3

対応

Rでは!!を用いることで先に変数の中身を展開したうえで関数に渡すことができる。

Programming with dplyr • dplyr

また、列名に!!を用いて展開した値を使用する場合は、=ではなく:=をセットで用いる必要がある。

Programming with dplyr • dplyr

iris2 = iris

for (n in 1:3) {
  column_name = paste('column',n, sep = "")
  iris2 = iris2 %>% 
    mutate(!!column_name := n)
}
head(iris2)

# =>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species column1 column2 column3
# 1          5.1         3.5          1.4         0.2  setosa       1       2       3
# 2          4.9         3.0          1.4         0.2  setosa       1       2       3
# 3          4.7         3.2          1.3         0.2  setosa       1       2       3
# 4          4.6         3.1          1.5         0.2  setosa       1       2       3
# 5          5.0         3.6          1.4         0.2  setosa       1       2       3
# 6          5.4         3.9          1.7         0.4  setosa       1       2       3

参考

dplyr: 高速data.frame処理 - Heavy Watal

r - Use dynamic variable names in `dplyr` - Stack Overflow