在R中筛选处理DataFrame行:移除Contact晚于End日期的行
问题描述
原始DataFrame如下:
ID Start End Contact 1 2022-08-08 2022-08-08 2022-08-08 1 2022-08-08 2022-08-08 2022-08-10 2 2022-08-05 2022-08-14 2022-08-06 2 2022-08-05 2022-08-14 2022-08-13 2 2022-08-05 2022-08-14 2022-08-16 3 2022-08-27 2022-08-31 2022-08-29 3 2022-08-27 2022-08-31 2022-09-01 3 2022-08-27 2022-08-31 2022-09-03 4 2022-08-28 2022-08-31 2022-08-28 4 2022-08-28 2022-08-31 2022-08-30
需要移除每个ID分组下Contact日期大于End日期的行,预期结果:
ID Start End Contact 1 2022-08-08 2022-08-08 2022-08-08 2 2022-08-05 2022-08-14 2022-08-06 2 2022-08-05 2022-08-14 2022-08-13 3 2022-08-27 2022-08-31 2022-08-29 4 2022-08-28 2022-08-31 2022-08-28 4 2022-08-28 2022-08-31 2022-08-30
尝试代码df %>% group_by(ID) %>% filter(Contact <= End)未得到预期结果。
问题原因
代码逻辑本身无错误,但**Start、End、Contact列是字符串类型而非日期时间类型**,直接进行字符串比较会按字典序判断(比如"2022-09-01"的字典序小于"2022-08-31"),和实际日期大小逻辑不符,导致过滤结果错误。
解决方案
先将日期列转换为Date类型,再执行过滤操作(无需group_by(ID),因为每行的End是对应自身的结束日期,逐行判断即可):
library(dplyr) # 构造示例数据(如果已有df可跳过此步) df <- data.frame( ID = c(1,1,2,2,2,3,3,3,4,4), Start = c("2022-08-08","2022-08-08","2022-08-05","2022-08-05","2022-08-05", "2022-08-27","2022-08-27","2022-08-27","2022-08-28","2022-08-28"), End = c("2022-08-08","2022-08-08","2022-08-14","2022-08-14","2022-08-14", "2022-08-31","2022-08-31","2022-08-31","2022-08-31","2022-08-31"), Contact = c("2022-08-08","2022-08-10","2022-08-06","2022-08-13","2022-08-16", "2022-08-29","2022-09-01","2022-09-03","2022-08-28","2022-08-30") ) # 转换日期列为Date类型 df <- df %>% mutate(across(c(Start, End, Contact), as.Date)) # 过滤Contact <= End的行 result <- df %>% filter(Contact <= End) # 查看结果 print(result)
执行后即可得到预期的过滤结果。
内容的提问来源于stack exchange,提问作者b10
相关产品推荐
相关产品推荐

