我一直在为这个问题而苦恼,我希望得到你的帮助。 为了说明这一点,我创建了两个虚拟数据集(数据 A 和数据 B)。
dataA <- data.frame(TimeofLife = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
TimeofDeath = c(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18))
dataB <- data.frame(Time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
Value = c(500, 510, 520, 530, 540, 500, 510, 520, 530, 540, 500, 510, 520, 530, 540))
下面是 dataA 的前 6 个值
TimeofLife TimeofDeath
1 1 4
2 2 5
3 3 6
4 4 7
5 5 8
6 6 9
和数据B
Time Value
1 1 500
2 2 510
3 3 520
4 4 530
5 5 540
6 6 500
我想使用 dataA 中的信息在 dataB 中创建子集。 例如,dataA 的第一行的值为 (1, 4)。使用这些作为值的范围,我想为 dataB 创建一个子集,如下所示:
Time Value
1 1 500
2 2 510
3 3 520
4 4 530
现在,我遇到的问题是,在我的真实数据集中,我需要创建许多子集(数千个以上),而我无法手动执行此操作。也就是说,我无法对每个子集进行硬编码,因为那将是一场噩梦并且容易出错。
我想要做的是创建一个 for 循环,我可以用它从 dataA 中提取我需要的信息,并使用它在 dataB 中创建子集。
我想要的代码的逻辑看起来像这样(这是废话,因为我不知道如何编码):
for(row i in dataA)
{find the values of TimeofLife and Time of Death in row dataA[i],
then use those values to filter a subset of dataB,
extract and save this subset as a dataframe}
非常感谢。
最佳答案
考虑使用 maply
或其包装器 Map
进行元素明智循环来构建数据框列表:
proc_subset <- function(x, y) {
dataB[dataB$Time >= x & dataB$Time <= y,]
}
# BUILD LIST OF SUBSET DATA FRAMES
subset_list <- Map(proc_subset, dataA$TimeofLife, dataA$TimeofDeath)
# NAME EACH ELEMENT
data_names <- paste("data", dataA$TimeofLife, dataA$TimeofDeath, sep="_")
subset_list <- setNames(subset_list, data_names)
# OUTPUT EACH DF ELEMENT
subset_list$data_1_4
subset_list$data_2_5
subset_list$data_3_6
...
关于r - 如何使用 **for** 循环清理大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61965446/