【问题标题】:R: Select rows (by group) based on certain conditions being metR:根据满足的某些条件选择行(按组)
【发布时间】:2016-06-17 03:47:53
【问题描述】:
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 中选择每个 ID 的 MAX(最新)值和 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,并且不会返回 1115,因为 Date3 中的值都不大于 Date1)。

我已经为此工作了很长一段时间(我是一个新手编码员),所以任何帮助将不胜感激!

【问题讨论】:

    标签: r conditional


    【解决方案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
    

    然后选择组的最小值和最大值:

    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))
    

    【讨论】:

    • Ryan,您对下面代码的问题完全正确。您的代码提供了我正在寻找的实际信息。感谢您注意到该问题并感谢您提供的代码。
    【解决方案2】:

    如果你使用 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)
    

    这应该会给你想要的数据框。

    【讨论】:

    • 感谢您的回复。粗略一看,这确实提供了我正在寻找的初始数据框(我使用效率低得多的代码得到了类似的结果)。但是,我确实需要满足上面列出的条件(在“鉴于”下列出),这是我真正苦苦挣扎的。对此有何建议?
    • 这就是为什么我有 filter(Date2 Date1) 确保你只有这样的记录 Date2 date 1。这不是你在看的为了?
    • 对不起,我第一次错过了那部分。这很有效,而且比我自己的工作要简单得多。谢谢!
    • 没问题!很高兴为您提供帮助:)
    • 鉴于原始问题中的描述,该过滤标准不一定正确。您要求 Date2 &lt; Date1Date3 &gt; Date1 出现在同一行,而书面标准说它们每个只需要出现在给定 ID 内的任何行中,不一定是同一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2021-08-08
    • 2019-04-24
    • 1970-01-01
    • 2020-12-06
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多