如何使用** for **循环清理大型数据集

时间:2020-05-22 23:34:04

标签: r function loops for-loop lapply

这个问题我一直在撞墙,我很乐意您的帮助。 为了说明这一点,我创建了两个虚拟数据集(数据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}

非常感谢您。

2 个答案:

答案 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)

如果允许打包,则允许非等额联接。如图所示,它利用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