如何使用tidyverse包移除所有分组中存在NA的对应行?
解决方案:移除所有存在NA的日期对应行
你原来用group_by(Class) %>% drop_na()的逻辑是按每个类别单独删除组内含NA的行,所以只删掉了类别B第3天的记录,但你需要的是只要某一天有任意类别出现NA,就把所有类别在这天的记录都删掉。
可以用两种方式实现:
方法1:先标记含NA的日期再过滤
library(tidyverse) # 构造原始数据 Class <- c(rep("A",10), rep("B",10), rep("C",10)) Days <- rep(1:10,3) Values <- c(1:12, NA, 14:30) DF <- data.frame(Class, Days, Values) # 处理数据:标记每个日期是否存在NA,再过滤掉这些日期 DF_clean <- DF %>% # 按日期分组,标记该日期是否有NA值 mutate(has_na = any(is.na(Values)), .by = Days) %>% # 过滤掉存在NA的日期 filter(!has_na)
注:.by = Days是dplyr 1.1.0及以上版本的语法,如果你的dplyr版本较低,改用group_by(Days) %>% mutate(has_na = any(is.na(Values))) %>% ungroup()
方法2:先提取含NA的日期列表再过滤
# 先找出所有存在NA的日期 bad_days <- DF %>% filter(is.na(Values)) %>% pull(Days) %>% unique() # 过滤掉这些日期的所有记录 DF_clean <- DF %>% filter(!Days %in% bad_days)
两种方法最终都会移除所有第3天的记录(不管是A、B还是C类),达到你想要的效果。
内容的提问来源于stack exchange,提问作者Daniel Valencia C.
相关产品推荐
相关产品推荐

