我有一个大数据集(超过20万行和一千个试验),其中有四列,并包含以下信息:
在每个试验中,我需要知道哪些行(用“ L” +数字”标识)位于支票的最大和较小值之间。 例如,在试用版10001中,我有5张支票,最大的是Check 3(反应= 56),较小的Check 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
答案 0 :(得分:0)
第一步,您要根据试验拆分data.frame:
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])
,]
})
选择现在是一个列表,其中包含每个试验的正确非检查选项。如果要将这些选择重新组合为一个大data.frame,可以使用bind_rows
软件包中的dplyr
install.packages('dplyr') # If you don't have it yet
Fullselection <- dplyr::bind_rows(selection)
如果由于某种原因您无法安装dplyr
,则do.call(rbind, selection)
也可以工作(但速度较慢,并且代码较丑。)