如何用dplyr筛选仅在最后日期所有X字段非零的用户?
解决方案
我们可以通过以下步骤用dplyr实现需求:
- 规范日期格式,避免字符串比较的误差;
- 定位全局最后可用日期;
- 筛选该日期下所有X字段均非零的用户;
- 按需提取这些用户的完整数据。
代码实现
library(dplyr) library(lubridate) # 用于处理日期格式 # 构造示例数据 df <- tibble( date = c("1/1", "2/1", "3/1", "4/1", "1/1", "2/1", "3/1", "4/1"), user = c(1, 1, 1, 1, 2, 2, 2, 2), X1 = c(0, 0, 0, 25, 285, 0, 0, 0), X2 = c(3, 7, 0, 4, 0, 0, 54, 0), X3 = c(34, 65, 0, 65, 0, 0, 0, 0) ) # 转换为标准日期格式,确保max()能正确识别最后日期 df <- df %>% mutate(date = dmy(date)) # 获取全局最后日期 last_date <- max(df$date) # 提取符合条件的用户ID valid_users <- df %>% filter(date == last_date) %>% # 仅保留最后日期的记录 filter(X1 != 0, X2 != 0, X3 != 0) %>% # 筛选所有X字段非零的行 pull(user) # 提取用户ID # 如需获取这些用户的完整数据 valid_user_data <- df %>% filter(user %in% valid_users)
代码说明
- 使用
lubridate::dmy()将字符串日期转为标准日期对象,避免字符串排序导致的最后日期识别错误; - 先筛选出最后日期的所有记录,再从中过滤出
X1、X2、X3均不为0的用户; - 通过
pull(user)提取符合条件的用户ID,后续可根据需要筛选这些用户的全部数据。
运行后,valid_users会得到[1] 1,即仅用户1符合要求,用户2因最后日期的所有X字段均为0被排除。
内容的提问来源于stack exchange,提问作者Telis
相关产品推荐
相关产品推荐

