使用 r for 循环在数据框中创建新列

Using r for loop to create new columns in data frame

我正在尝试在 r 中创建一个 for 循环,以便 1. 在数据框中创建新列和 2. 计算多个变量的一些简单表达式。

我的数据框有 10 列和 22 行

df <- setNames(data.frame(replicate(22,sample(0:10,10,rep=TRUE))), 
     sprintf("rmeas%s",seq(from = 0, to = 84, by = 4)))

我想创建一个简单的 for 循环来创建 21 个名为 'rmaster' 的新列,后跟一个数字(4-84 乘以 4)。第一个新列 (df$rmaster4) 将通过以下计算填充:

df$rmaster4 <- (df$rmeas4^3 + df$rmeas0*df$rmeas4+ df$rmeas0^2) / 2.12352

到目前为止,我有以下代码:

for(i in seq(from = 0, to = 84, by = 4)) {

assign("df", `$<-`(df, paste0("rmaster", i+4), 
              (get(paste0("x$rmeas", i+4))^3 + 
                 get(paste0("x$rmeas", i))*get(paste0("x$rmeas", i+4)) + 
                 get(paste0("x$rmeas", i+4))^2) / 2.12352))
}

这里似乎有很多问题。对于初学者,我想创建 rmaster4-rmaster84,此代码将创建 rmaster4-rmaster88。接下来,我知道我不能像现在这样使用 get() 函数。不幸的是,我无法解决这些问题。任何见解将不胜感激。

首先,回答你的问题,然后按照 eddi 上面的评论,这将是正确的代码:

for(i in seq(from = 0, to = 80, by = 4)) {
       print(paste0("rmeas", i+4))
         df[ , paste0("rmaster", i)] = ( df[ ,paste0("rmeas", i+4)] ^3 +
               df[ , paste0("rmeas", i)] * df[ ,paste0("rmeas", i+4)] + 
               df[ , paste0("rmeas", i+4)] ^2 ) / 2.12352
}

请注意,我只去了 i=80,因为没有 rmeas88 列。

一种更符合 R 风格的方法是:

 i.v=  seq(from = 0, to = 80, by = 4)
 A = sapply( i.v, function(i) {
             ( df[ ,paste0("rmeas", i+4)] ^3 +
               df[ , paste0("rmeas", i)] * df[ ,paste0("rmeas", i+4)] + 
               df[ , paste0("rmeas", i+4)] ^2 ) / 2.12352
})
colnames(A) = paste0( "rmaster", i.v)
df = cbind( df, A )