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



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

  • "试验">:序列号(
  • "Is.Check">:一列,1表示检查,0表示不检查
  • "ID">:带有检查或行名称的列(非检查(
  • "反应">:反应变量

我需要知道在每次试验中,哪些行(用"L"+数字"标识(介于检查的最大值和较小值之间。例如,在试验10001中,我有5个检查,最大的是检查3(反应=56(,较小的是检查1(反应=50(。我需要知道哪条线位于这两个值之间,即(大于或等于50,小于或等于56(。附上了一个小数据集作为示例。在这种情况下,在试验10001中,除"L3"外,应选择所有线路。另一方面,在试验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

作为第一步,您需要根据试用版拆分数据帧:

splitted <- split(dataset, dataset$Trials)

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

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

})

选择现在是一个列表,每个试验都有一个正确的非检查选择。如果你想将这些选择重新组合成一个大的数据帧,你可以使用dplyr包中的bind_rows

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

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

最新更新