Использование переменной из цикла для наименования столбцов в R
Имеется датафрейм со столбцом, предположим, Watch.time.Minutes. Есть необходимость в этот же самый датафрейм добавить ещё несколько столбцов, которые будут представлять собой степени исходного, а называться, соответственно, Watch.time.Minutesi, где i ∈ [2;11]. Вопрос состоит в том, как реализовать вот эту процедуру наименования в цикле, чтобы значение i из цикла автоматически трансформировалось и включалось в название столбца?
Ответы (2 шт):
Эта процедура в цикле реализуется буквально так, как она описана
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)))
вообще-то циклы в 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)