我使用的数据集在不同的时间点包含相同变量的值。在下面的示例中,我在时间点1和2处具有变量a和b的值。
> set.seed(1)
> data <- data.frame(matrix(sample(16), ncol = 4))
> names(data) <- paste(rep(c("a", "b"), each = 2), 1:2, sep = "")
> data
a1 a2 b1 b2
1 5 3 14 13
2 6 10 1 8
3 9 11 2 4
4 12 15 7 16
现在,假设我想为两个时间点计算一个新变量,以便它包含a和b的总和(而不是如下例所示的NA)。由于我的实际数据集包含大约15个不同的变量和10个时间点(所以150列),我想自动计算10个新变量。
> data[, paste("ab", 1:2, sep = "")] <- NA
> data
a1 a2 b1 b2 ab1 ab2
1 5 3 14 13 NA NA
2 6 10 1 8 NA NA
3 9 11 2 4 NA NA
4 12 15 7 16 NA NA
我之前使用的是Stata,在那里我可以创建一个简单的foreach&#39;循环来做到这一点。像下面的东西。
foreach t of numlist 1/2 {
generate ab`t' = a`t' + b`t'
}
但是我已经知道在R中使用循环是不可行的,我也不知道如何循环使用R中的变量名。
那么在R中我的问题的正确解决方案是什么?
答案 0 :(得分:3)
这将复制您在Stata中使用的相同foreach循环。
for(i in 1:2){
data[, paste("ab", i, sep="")] <-
data[,paste("a", i, sep="")] + data[, paste("b", i, sep="")]
}
输出如下:
> data
a1 a2 b1 b2 ab1 ab2
1 15 1 16 12 31 13
2 10 7 14 3 24 10
3 2 5 9 4 11 9
4 6 8 13 11 19 19
答案 1 :(得分:2)
你可以不用迭代:
data$ab1 <- data$a1 + data$b1
data$ab2 <- data$a2 + data$b2
或
data <- transform(data, ab1=a1+b1, ab2=a2+b2)
顺便说一句:
最好不要命名对象data
,因为data=
通常是函数中的参数。
答案 2 :(得分:2)
这是一种方法。我们迭代列名的唯一值,并在这些唯一值与colname值匹配时计算rowSums
。
sapply(unique(sub('\\D', '', names(data))),
function(i) rowSums(data[,grepl(i, sub('\\D', '', names(data)))]))
# 1 2
#[1,] 17 23
#[2,] 24 22
#[3,] 14 10
#[4,] 15 11
答案 3 :(得分:2)
以R
方式执行此操作,
*apply
函数rowSums
(如@Sotos中的答案)一起
data[paste0('ab', 1:2)] <- sapply(1:2,
function(i)
rowSums(data[paste0(c('a', 'b'), i)]))
data
# a1 a2 b1 b2 ab1 ab2
# 1 5 3 14 13 19 16
# 2 6 10 1 8 7 18
# 3 9 11 2 4 11 15
# 4 12 15 7 16 19 31
ps,在程序中使用vapply
代替,你需要提供一个额外的参数来指定输出的形状,但它更安全,有时更快