使用 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 )
我正在尝试在 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 )