r - 如何提取数据集的特定区间?
问题描述
我有一个大数据集(超过 20 万行和一千次试验),其中有四列包含以下信息:
- “试验”:一个序号)
- "Is.Check":一列,1 表示检查,0 表示非检查
- “ID”:带有支票或行名称的列(非支票)
- “反应”:反应变量
我需要知道在每个试验中,哪些行(用“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
解决方案
作为第一步,您希望按 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)
如果由于某种原因无法安装dplyr
,do.call(rbind, selection)
也可以使用(但速度会慢一些,而且代码更难看。)
推荐阅读
- templates - 如何使用 xslt 1.0 在输出中排除子节点?
- ios - UISearchBar 打开第二个 TableView 没有结果
- windows-services - 作为本地系统运行的 Windows 服务应该将私钥存储在文件系统中的什么位置?
- db2 - 在 Db2 中识别 UDF 内的模式
- javascript - 如何仅停止最后一个获取请求
- java - 使用嵌入式码头时 jax-rs Web 服务给出 404
- mysql - 查询以从 Spring Data mongo 返回单个字段
- swift - 联系位掩码
- sql - MSSQL:多次引用其他表
- tfs - TFS 迁移到具有新名称的新服务器