0

我有这个 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 != " ")
4

2 回答 2

2

可能的解决方案:首先我们删除所有包含 NA 的行keyword,然后为可能丢失id的 s 添加新行(所有其他列现在都将包含 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>
于 2021-10-08T10:39:44.220 回答
2

您可以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      
于 2021-10-08T12:19:21.727 回答