我有一个大数据集(超过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)
如果由于某种原因无法安装dplyr
,do.call(rbind, selection)
也可以工作(但速度慢一点,而且代码更难看。(