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

时间:2017-10-06 21:57:37

标签: r for-loop paste

我试图在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个名为&#39; rmaster&#39;的新列。接下来是一个数字(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()函数。不幸的是,我无法解决问题。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,回答您的问题,并按照上面的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 )