Создайте имена для новых столбцов в цикле

Я складываю каждый третий столбец и помещаю результат в новый столбец, мне нужно сделать это для фрейма данных с более чем 300 столбцами. Я могу сделать цикл для выполнения добавления, но у меня проблемы с присвоением имен новым столбцам. Вот пример того, что я хочу, чтобы я пробовал так var:

x1 <- rnorm(100)
x2 <- rnorm(100)
x3 <- rnorm(100)
x4 <- rnorm(100)
x5 <- rnorm(100)
x6 <- rnorm(100)
x7 <- rnorm(100)
x8 <- rnorm(100)
x9 <- rnorm(100)
x10 <- rnorm(100)
x11 <- rnorm(100)
x12 <- rnorm(100)
df <- data.frame(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10, x11,x12)

for (i in 2:4){
  new <-  apply(df[,c(i,i+3,i+6)],1,sum,na.rm=T)
  df <- cbind(df, new[i-1])
}

Я хотел бы, чтобы имена новых столбцов отображались как «new1», «new2» и «new3», однако с моим кодом все они называются «new [i]. Пожалуйста, не то, что я уверен, что есть другие и, возможно, лучшие способы создания этих столбцов без использования цикла, но мне особенно интересно выяснить, что не так с моим циклом, и поддерживать его использование. Спасибо.


person steve zissou    schedule 01.08.2017    source источник
comment
К вашему сведению, более R-ишный, векторизованный способ сделать это будет cbind(df, setNames(data.frame(rowSums(df[c(T, F, F)]), rowSums(df[c(F, T, F)]), rowSums(df[c(F, F, T)])), paste0('new', seq(ncol(df) / 4))))   -  person Sotos    schedule 01.08.2017


Ответы (2)


Замените cbind на следующее, и тогда вы сможете назначать новые имена столбцов.

for (i in 2:4){
  new <-  apply(df[,c(i,i+3,i+6)],1,sum,na.rm=T)
  df[paste0("new", i-1)] <- new
}
person www    schedule 01.08.2017
comment
Большое спасибо! я также обнаружил, что добавление names(df)[names(df) == "new"] <- paste("new",i-1) решит эту проблему - person steve zissou; 01.08.2017

Вы хотите, чтобы результатом был список фреймов данных - или 1 фрейм данных с добавлением каждого из столбцов «new [n]»? Мое предположение было вторым...

try_me <- cbind(df, as.data.frame(lapply(2:4, function(i){
    new <-  apply(df[,c(i,i + 3,i + 6)], 1, sum, na.rm = T)
    new_new <- setNames(as.data.frame(new), sprintf('new%s', i))
    new_new
})))




> head(try_me[,10:length(try_me)], 3)
         x10        x11        x12       new2      new3      new4
1 -0.5166034 -2.3482017  1.1860505 -3.1887135 -2.556875  1.971905
2  1.6145366 -0.6343859 -0.1606501  0.5623611  1.606436  1.657789
3  0.3042580 -0.2176613  1.6796682  1.3500827 -1.022463 -1.182379
person Carl Boneri    schedule 01.08.2017