如何提取数据集的特定区间?

How to extract specific intervals of the dataset?

我有一个大数据集(超过 20 万行和一千次试验),其中有四列包含以下信息:

我需要知道在每次试验中哪些行(用 "L" + 数字标识)位于检查的最大值和最小值之间。 例如,在试验 10001 中,我有 5 个检查,最大的是检查 3(反应 = 56)和较小的检查 1(反应 = 50)。我需要知道这两个值之间有哪些线,即(大于或等于 50,小于或等于 56)。附上一个小数据集作为示例。在此,在试验 10001 中,所有行都应为 select,但 "L3" 除外。另一方面,在试验 10002 中,较小的 Check 是 Check-1 (50),最大的是 Check-7 (60),因此,只有 L3 和 L9 应该被 selected。 Checks 和 Reaction Values 在每次试验中都会发生变化,因此,我需要提取每次试验中最大和较小检查值之间的值的行。

Trials  Is.Check     ID       Reaction
10001   1            Check-1  50
10001   0            L1       50
10001   0            L2       50
10001   0            L10      50
10001   0            L9       50
10001   0            L6       50
10001   0            L3       48
10001   0            L4       50
10001   0            L8       50
10001   1            Check-5  52
10001   0            L7       50
10001   1            Check-2  52
10001   1            Check-4  54
10001   0            L5       52
10001   1            Check-3  56
10002   1            Check-1  50
10002   0            L1       48
10002   0            L2       48
10002   0            L3       54
10002   0            L4       64
10002   0            L5       64
10002   0            L6       62
10002   0            L7       62
10002   0            L8       70
10002   0            L9       52
10002   1            Check-7  60
10002   1            Check-2  54
10002   1            Check-6  56
10002   1            Check-3  54

作为第一步,您想要拆分 data.frame,每个试验:

splitted <- split(dataset, dataset$Trials)

然后,对于这些元素中的每一个,我们 select 所有非检查元素,它们遵守 2 个条件:>= 最小检查,<= 最大检查。我们需要为 splitted 中的每个子 data.frame 执行此操作,因此我们使用 lapply 将我们的函数应用于每个子 data.frame :

selection <- lapply(splitted, function(subdf) {
  subdf[subdf$Is.Check==0 &
        subdf$Reaction >= min(subdf$Reaction[subdf$Is.Check==1]) &
        subdf$Reaction <= max(subdf$Reaction[subdf$Is.Check==1])
       ,]

})

选择现在是一个列表,每个试验都有 select 个正确的非检查项。如果你想将那些 select 离子重新组合成一个大的 data.frame 你可以使用 dplyr-package

中的 bind_rows
install.packages('dplyr') # If you don't have it yet
Fullselection <- dplyr::bind_rows(selection)

如果由于某种原因您无法安装 dplyrdo.call(rbind, selection) 也可以(但速度稍慢,而且代码更丑陋。)