这个问题我一直在撞墙,我很乐意您的帮助。 为了说明这一点,我创建了两个虚拟数据集(数据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
和dataB
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}
非常感谢您。
答案 0 :(得分:2)
考虑使用mapply
或其包装器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
...
答案 1 :(得分:1)
如果允许打包,则data.table允许非等额联接。如图所示,它利用by = .EACHI
按每行分组。
library(data.table)
setDT(dataA)
setDT(dataB)
dataB[dataA,
on = .(Time >= TimeofLife,
Time <= TimeofDeath),
j = .(Values = .(Value)),
by = .EACHI,
allow.cartesian = TRUE
]
# Time Time Values
# <num> <num> <list>
# 1: 1 4 500,510,520,530
# 2: 2 5 510,520,530,540
# 3: 3 6 520,530,540,500
# 4: 4 7 530,540,500,510
# 5: 5 8 540,500,510,520
# 6: 6 9 500,510,520,530
# 7: 7 10 510,520,530,540
# 8: 8 11 520,530,540,500
# 9: 9 12 530,540,500,510
#10: 10 13 540,500,510,520
#11: 11 14 500,510,520,530
#12: 12 15 510,520,530,540
#13: 13 16 520,530,540
#14: 14 17 530,540
#15: 15 18 540