如何提取数据集的特定间隔?

时间:2018-12-12 18:42:51

标签: r dataset extract mining

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

  • “试验” :序列号)
  • “ Is.Check” :一列包含1个支票和0个非支票
  • “ ID” :带有支票或单行名称(非支票)的列
  • “反应” :响应变量

在每个试验中,我需要知道哪些行(用“ 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

1 个答案:

答案 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)也可以工作(但速度较慢,并且代码较丑。)