【问题标题】:How to extract specific intervals of the dataset?如何提取数据集的特定区间?
【发布时间】:2018-12-12 18:42:51
【问题描述】:

我有一个大数据集(超过 20 万行和一千次试验),其中包含四列信息:

  • “试验”:序号)
  • “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。 Checks 和 Reaction Values 在每次 Trial 中都会发生变化,因此,我需要提取每个 Trial 中最大和较小检查之间的值的行。

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

【问题讨论】:

  • x[ 50 <= x$Reaction & x$Reaction <= 56, ]?
  • 试用10002,为什么只选L8
  • 抱歉,只有 L3 和 L9。

标签: r dataset extract mining


【解决方案1】:

作为第一步,您希望按 Trial 拆分 data.frame:

splitted <- split(dataset, dataset$Trials)

然后,对于这些元素中的每一个,我们选择所有符合 2 个条件的非检查元素:&gt;= 是最小的检查,&lt;= 是最大的检查。我们需要对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])
       ,]

})

Selection 现在是一个列表,其中为每个试验选择正确的非检查。如果您想将这些选择重新组合到一个大的 data.frame 中,您可以使用 dplyr-package 中的 bind_rows

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

如果由于某种原因无法安装dplyrdo.call(rbind, selection) 也可以使用(但速度会慢一些,而且代码更丑。)

【讨论】:

  • 完美!!这是!非常感谢!
  • 不客气。你能接受我的回答吗?然后我会得到更多的声望点 :-) 你可以通过点击我的答案左侧(靠近顶部)的“V”来接受,它应该变成绿色。
  • 完成!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2015-08-27
相关资源
最近更新 更多