我试图在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()函数。不幸的是,我无法解决问题。任何见解将不胜感激。
答案 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 )