【发布时间】:2016-08-12 16:19:12
【问题描述】:
我正在使用一个数据集,该数据集包含不同时间点的相同变量的值。在下面的示例中,我有变量 a 和 b 在时间点 1 和 2 的值。
> 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”循环来执行此操作。如下所示。
foreach t of numlist 1/2 {
generate ab`t' = a`t' + b`t'
}
但我知道在 R 中使用循环是不可行的,我也不知道如何循环像在 R 中那样的变量名。
那么对于我在 R 中的问题,正确的解决方案是什么?
【问题讨论】:
-
您还可以考虑将数据转换为长格式。像这样,它不是整齐的数据,因为您在列名中有信息。
-
@Heroka 我实际上将数据重新整形为宽格式,因为它看起来更易于操作。但是你说的不整洁是对的,所以我可能会重新考虑。
-
您的问题/问题似乎与其说是关于迭代,不如说是关于 Stata 在循环中将变量粘贴到名称中的紧凑语法。 (即
for(i in 1:2) {}在R中完成同样的循环 -
@jaimedash 我的 Stata 解决方案只是一个示例。由于根据 R 中不推荐使用“Internet”循环,我实际上是在寻找一种不涉及循环但其他迭代方式(例如使用应用和/或函数)的解决方案。