【问题标题】:I an ordered record set, return the first value meeting a criterion in a sub-group, or return the earliest record where the criterion is unmetI 一个有序的记录集,返回子组中第一个满足条件的值,或者返回不满足条件的最早记录
【发布时间】:2021-11-30 09:09:49
【问题描述】:

我有一个有序事件记录集的数据框,它与具有唯一 id (grpid) 的组相关,其中记录是事件 (event),一个组 id 可能与一个或多个事件相关,但所有事件具有排名顺序变量(ordid)。 我要完成的任务是按照每个组中满足一组标准的事件顺序返回最早的事件。如果没有记录符合条件,只需返回最早的。我需要他们返回一个新的数据集。 因此,在 data.frame 'd' 中的最小可复制示例中,我的标准是返回每个组中不以 'x' 或 'y' 开头的第一个事件,但如果所有事件都以 x 或 y 开头,则返回接受第一个出现的记录,即使它是 x/y 记录。所以在“a”组的第一个事件中,d21 符合我的标准,所以我的新集合将包括“a”和“d21”。第二组有四个记录。前两个被拒绝,但选择了“b”“j10”,因为它是不以“x”或“y”开头的最低排名记录。在最后一种情况下,所有记录都以“x”或“y”开头,所以我只想要排名最低的“x10” 真实的数据集大约数亿,因此效率是一个考虑因素。下面提供了 MRE 的代码。

#make data.frame of sample data
grpid<-c('a','a','a','b','b','b','b','c','c')
ordid<-c(1,2,3,1,2,3,4,1,2)
event<-c('d21','e30','a10','x89','y77','j10','d17','x10','x22')
d<-data.frame(grpid,ordid,event)
d
#make data.frame of desired output
grpid1<-c('a','b','c')
event1<-c('d21','j10','x10')
out<-data.frame(grpid1,event1)
out

【问题讨论】:

    标签: r dataframe subset rank


    【解决方案1】:

    按'grpid'分组,创建一个索引,其中'event'的第一个字符不是'x'或'y',然后slice基于索引的第一个元素和ifall的值是“x”或“y”,然后返回第一个观察结果

    library(dplyr)
    d %>%
        group_by(grpid) %>% 
        mutate(ind = event == event[!substr(event, 1, 1) %in% c('x', 'y')][1]) %>%
        slice(if(all(is.na(ind))) 1 else which(ind)[1]) %>%
        ungroup %>% 
        select(-ordid, -ind)
    

    -输出

    # A tibble: 3 × 2
      grpid event
      <chr> <chr>
    1 a     d21  
    2 b     j10  
    3 c     x10  
    

    或者使用summarisecoalesce

    d %>% 
       group_by(grpid) %>%
       summarise(event = coalesce(event[!substr(event, 1, 1) %in% 
            c('x', 'y')][1], first(event)))
    # A tibble: 3 × 2
      grpid event
      <chr> <chr>
    1 a     d21  
    2 b     j10  
    3 c     x10  
    

    【讨论】:

    • 非常感谢您的及时回复。这里有一些我不太熟悉的 dplyr 命令。这是进一步探索它们的有用机会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多