2017-10-06 213 views
0

我正在尝试在r中创建一个for循环1.在数据框中创建新列并2.计算多个变量的一些简单表达式。使用r for循环来创建数据帧中的新列

我的数据框有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()函数。不幸的是,我无法补救这些问题。任何有识之士将不胜感激。

+1

'DF [[paste0( “rmaster”,I + 4)]] = DF [[paste0( “rmeas”,I + 4)]]^3 + ...' – eddi

+1

你不应该在R中使用'assign',除非你明白为什么你不应该在R.中使用'assign'。 – eddi

+0

谢谢。你的回应现在对我来说似乎非常明显。 你有什么关于为什么使用'assign'是否是否定的链接?我很欣赏这种见解。 – afleishman

回答

1

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