首页 > 解决方案 > 如何提取数据集的特定区间?

问题描述

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

我需要知道在每个试验中,哪些行(用“L”+ Number“标识)停留在最大和较小的检查值之间。例如,在试验 10001 中,我有 5 个检查,最大的是检查 3(反应 = 56)和较小的检查1(反应=​​ 50)。我需要知道哪些线停留在这两个值之间,即(大于或等于50和小于或等于56)。附加了一个小数据集作为示例。在这个,在trial 10001 所有行都应该选择,除了“L3”。另一方面,在 trial 10002 中,较小的 Check 是 Check-1 (50),最大的是 Check-7 (60),因此,应该只有 L3 和 L9检查和反应值在每次试验中都会发生变化,因此,我需要提取每个试验中最大和较小检查之间的值的线。

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

标签: rdatasetextractmining

解决方案


作为第一步,您希望按 Trial 拆分 data.frame:

splitted <- split(dataset, dataset$Trials)

然后,对于这些元素中的每一个,我们选择所有符合 2 个条件的非检查元素:>=最小的检查和<=最大的检查。我们需要对 中的每个 sub-data.frames 执行此操作splitted,因此我们使用lapply, 将我们的函数应用于每个 sub-data.frames:

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])
       ,]

})

选择现在是一个列表,其中为每个试验选择正确的非检查。如果您想将这些选择重新组合到一个大的 data.frame 中,您可以bind_rows使用dplyr-package

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

如果由于某种原因无法安装dplyrdo.call(rbind, selection)也可以使用(但速度会慢一些,而且代码更难看。)


推荐阅读