如何提取数据集的特定区间?
How to extract specific intervals of the dataset?
我有一个大数据集(超过 20 万行和一千次试验),其中有四列包含以下信息:
- "Trials":一个序号)
- "Is.Check": 1为支票,0为非支票的列
- "ID": 包含检查或行名称的列(非检查)
- "Reaction":响应变量
我需要知道在每次试验中哪些行(用 "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)
如果由于某种原因您无法安装 dplyr
,do.call(rbind, selection)
也可以(但速度稍慢,而且代码更丑陋。)
我有一个大数据集(超过 20 万行和一千次试验),其中有四列包含以下信息:
- "Trials":一个序号)
- "Is.Check": 1为支票,0为非支票的列
- "ID": 包含检查或行名称的列(非检查)
- "Reaction":响应变量
我需要知道在每次试验中哪些行(用 "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)
如果由于某种原因您无法安装 dplyr
,do.call(rbind, selection)
也可以(但速度稍慢,而且代码更丑陋。)