R:根据满足的特定条件选择行(按组)

时间:2016-06-16 19:15:47

标签: r conditional

ID      Date1       Date2       Date3
1111    4/6/2016    NA          5/1/2016
1111    4/6/2016    3/31/2016   NA
1111    4/6/2016    4/2/2016    3/29/2016
1112    4/17/2016   4/29/2016   6/2/2016
1112    4/17/2016   5/1/2016    5/16/2016
1112    4/17/2016   NA          2/1/2016
1113    4/6/2016    3/4/2016    5/12/2016
1113    4/6/2016    4/4/2016    2/16/2016
1114    5/2/2016    4/20/2016   5/29/2016
1114    5/2/2016    4/30/2016   5/21/2016
1115    3/31/2016   2/3/2016    2/2/2016
1115    3/31/2016   2/5/2016    2/4/2016

鉴于上述数据集,我想从Date3中选择MAX(最新)值,并从每个ID的Date2中选择MIN(最旧)值,假设:

Date2中至少有一个值比Date1少(旧),而Date3中的一个值比Date1 PER ID更多(更新)。

我希望返回以下内容:

1111    4/6/2016    3/31/2016   5/1/2016
1113    4/6/2016    3/4/2016    5/12/2016
1114    5/2/2016    4/20/2016   5/29/2016

(不会返回1112,因为Date2中的值都不小于Date1,并且因为Date3中的值都不大于Date1,所以不会返回1115)。

我已经在这方面工作了很长时间(我是一名新手编码员),所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:1)

我会分两步完成。首先,获取符合条件的ID集:

library(magrittr)
library(dplyr)
selected_ids <- data %>% 
    group_by(ID) %>% 
    summarize(PassD1vD2=any(na.omit(Date2 < Date1)),
              PassD1vD3=any(na.omit(Date3 > Date1))) %>%
    filter(PassD1vD2 & PassD1vD3) %$% ID %>% unique

然后选择组min&amp;最大:

filtered_data <- data %>% 
    filter(ID %in% selected_ids) %>% 
    group_by(ID) %>%
    summarize(Date1=Date1[1], minD2=min(Date2, na.rm=TRUE), maxD3=max(Date3, na.rm=TRUE))

答案 1 :(得分:0)

如果你使用dplyr库试试这个:

library(dplyr)
filtered_data <- data %>% filter(Date2 < Date1 & Date3 > Date1) %>%
 group_by(ID, Date1) %>% 
 summarize(minD2 = min(Date2, na.rm = T), maxD3 = max(D3, na.rm = T)

那应该给你想要的数据框。