Использование переменной из цикла для наименования столбцов в R

Имеется датафрейм со столбцом, предположим, Watch.time.Minutes. Есть необходимость в этот же самый датафрейм добавить ещё несколько столбцов, которые будут представлять собой степени исходного, а называться, соответственно, Watch.time.Minutesi, где i ∈ [2;11]. Вопрос состоит в том, как реализовать вот эту процедуру наименования в цикле, чтобы значение i из цикла автоматически трансформировалось и включалось в название столбца?


Ответы (2 шт):

Автор решения: Ogurtsov

Эта процедура в цикле реализуется буквально так, как она описана

library(data.table)
dt <- data.table(a = 1:10)
for (i in 2:11) {
  new_var <- paste0("var_", i)
  dt[, (new_var) := a^i]
}

Без data.table не так удобно:

df <- data.frame(a = 1:10)
df <- lapply(1:11, function(i) df$a^i)
df <- as.data.frame(df, col.names = c("a", paste0("var_", 2:11)))
→ Ссылка
Автор решения: aleksandr barakin

вообще-то циклы в r имеет смысл применять разве что в тех случаях, когда с циклом получается быстрее и/или проще.

вот такой примерно функцией можно динамически добавить столбцы с указанными степенями указанной переменной:

f <- function(d, c, e) {
  cbind(
    d,
    lapply(
      e,
      function(x) {
        as.data.frame(
          unclass(
            d[c]^x
          ),
          col.names = c(
            paste0(
              c,
              x
            )
          )
        )
      }
    )
  )
}

здесь:

  • параметр d — исходная таблица
  • параметр c — имя переменной, значения которой будут возведены в степени
  • параметр e — вектор со степенями
  • cbind() — объединить столбцы (аргументами передаются исходная таблица и результат выполнения lapply())
  • lapply(e , function()...) — применить к вектору e указанную функцию
  • as.data.frame(..., col.names=...) — преобразовать аргумент в data.frame, дав столбцу указанное имя
  • unclass(d[c]^x) — возвести в степень x содержимое переменной d[c] (имеющей класс data.frame), а затем убрать класс (без этого as.data.frame() игнорирует содержимое аргумента col.names)
  • paste0(c, x) — конкатенация переменных c (ниже в примере содержит строку "a") и x (в которую будут последовательно подставляться функцией lapply() требуемые степени)

в одну строку, без пробелов:

f<-function(d,c,e){cbind(d,lapply(e,function(x){as.data.frame(unclass(d[c]^x),col.names=c(paste0(c,x)))}))}

а это пример применения:

d <- data.frame(x=5:9, a = 1:5)
d
#>   x a
#> 1 5 1
#> 2 6 2
#> 3 7 3
#> 4 8 4
#> 5 9 5
f(d, "a", 2:4)
#>   x a a2  a3  a4
#> 1 5 1  1   1   1
#> 2 6 2  4   8  16
#> 3 7 3  9  27  81
#> 4 8 4 16  64 256
#> 5 9 5 25 125 625

Created on 2021-06-06 by the reprex package (v0.2.1)

→ Ссылка