r - 在 R 中,如果满足条件(等于 1),是否可以提取每个 ID 最早日期的行,如果不满足条件,则提取最晚日期?

标签 r dplyr data.table grouping subset

很抱歉,如果之前有人问过这个问题,但我在这里找不到解决方案。在 R 中,我想在给定条件的最早数据点上按 ID 过滤我的数据集,如果没有则在最新数据点上过滤。

因此,根据这个数据集查看个人是否做出了回应:

    ID   response   follow_up_date
    P1  0   2001-01-01
    P1  0   2002-01-01
    P1  0   2003-01-01
    P2  0   2003-01-01
    P2  1   2004-01-01
    P3  1   2001-01-01
    P3  1   2003-01-01
    P3  1   2004-01-01

我想提取每个 ID 的行,其中包含有人响应的最早日期 (response=1),如果他们尚未响应 (response = 0),我想提取最后一行 -更新。所以输出应该是:

     ID   response  follow_up_date
     P1 0   2003-01-01
     P2 1   2004-01-01 
     P3 1   2001-01-01

有谁知道我将如何实现这一目标?我假设有一种使用 dplyrdata.table 的方法,但我还没有完全弄明白。

创建数据框的代码在这里:

ID<-c("P1","P1","P1","P2","P2","P3","P3","P3")
response<-c(0,0,0,0,1,1,1,1)
follow_up_date<-as.Date(c("2001-01-01","2002-01-01","2003-01-01","2003-01-01","2004-01-01","2001-01-01","2003-01-01","2004-01-01"))
df<-data.frame(ID,response,follow_up_date)

最佳答案

df %>% 
  group_by(ID) %>% # group by ID
  mutate(index = case_when(response == 1 ~ which.min(follow_up_date),  # get earliest date if response == 0
                           response == 0 ~ which.max(follow_up_date))) %>% # get latest date if reponse == 1
  slice(first(index)) %>% # get first occurance of index
  select(-index)

或使用data.table

library(data.table)
setDT(df)
df[df[,.I[ifelse(response[1] == 0,which.max(follow_up_date),which.min(follow_up_date))],by = ID]$V1]

关于r - 在 R 中,如果满足条件(等于 1),是否可以提取每个 ID 最早日期的行,如果不满足条件,则提取最晚日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64572142/

相关文章:

R shell.exec 需要完整的文件路径

R描述和R Markdown

r - 如何使用 dplyr 在 R 中转置数据帧?

r - 在列中找到最近的前一个负值

r - 计算一列最后一百行的平均值

r - 系统 ("timedatectl") "Failed to query server: Connection timed out"

r if else 基于多个条件

R (data.table) : Fast counts of value matches in multiple column

使用 'R'中的数据表迭代替换NA

r - 如何读取带有年份和周数的数据文件