【问题标题】:Create names for new columns within a loop为循环中的新列创建名称
【发布时间】:2017-08-01 13:57:03
【问题描述】:

我每隔三列将结果加在一起并将结果放入一个新列中,我必须在一个包含 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]。请不要说我确定有在不使用循环的情况下创建此列的其他可能更好的方法,但我特别有兴趣找出我的循环有什么问题并保持使用它。谢谢

【问题讨论】:

  • 仅供参考,一种更 R-ish、矢量化的方式是 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))))

标签: r loops dataframe columnname


【解决方案1】:

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
}

【讨论】:

  • 非常感谢!我还发现添加names(df)[names(df) == "new"] &lt;- paste("new",i-1) 会解决它
【解决方案2】:

您希望结果是一个数据框列表 - 还是 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

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多