在循环中为新列创建名称
Create names for new columns within a loop
我每三列相加并将结果放在一个新列中,我必须在超过 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]”。请并不是说我确定有其他更好的方法可以在不使用循环的情况下创建此列,但我特别感兴趣的是找出我的循环有什么问题并继续使用 it.Thanks
将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
}
您希望结果是一个数据框列表,还是 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
我每三列相加并将结果放在一个新列中,我必须在超过 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]”。请并不是说我确定有其他更好的方法可以在不使用循环的情况下创建此列,但我特别感兴趣的是找出我的循环有什么问题并继续使用 it.Thanks
将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
}
您希望结果是一个数据框列表,还是 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