r语言 - 按组过滤NAs



我有这个df

df <- data.frame(
id = c(1L,1L,1L,2L,2L,3L),
keyword = c("car","hospital",NA,"cat",NA,NA))

我想要这个

df <- data.frame(
id = c(1L,1L,2L,3L),
keyword = c("car","hospital","cat",NA))

如果有关键字,我想保留它,如果没有,保留NA

试试

df %>% group_by(id) %>% filter(!is.na(keyword) | keyword != " ")

您可以有条件地filter

如果在一个组中,所有NA值都存在,则返回第一行,否则返回非na行。

library(dplyr)
df %>%
group_by(id) %>%
filter(if(all(is.na(keyword))) row_number() == 1 else !is.na(keyword)) %>%
ungroup
#    id keyword 
#  <int> <chr>   
#1     1 car     
#2     1 hospital
#3     2 cat     
#4     3 NA      

可能的解决方案:首先我们删除keyword中所有具有NA的行,然后我们为可能缺失的ids添加新行(其中所有其他列现在将包含NA):

library(dplyr)
library(tidyr)
df %>% 
filter(!is.na(keyword)) %>% 
full_join(df %>% select(id) %>% unique())

的回报:

id  keyword
1  1      car
2  1 hospital
3  2      cat
4  3     <NA>

最新更新