r 仅当特定列中不丢失时才保留行

r retain rows only if non missing in specific column

我的数据框有这样的列和行

   Id    Date    Col1    Col2    Col3    X1
   1     1/1/22  NA      1       0       
   1     1/1/22  0       0       1       6
   2     5/7/21  0       1       0       
   2     5/7/21  0       2       0      

我喜欢删除 X1 列的值缺失或为空的重复行(相同 ID,相同日期)的行。如果两行都缺少该 ID 和日期的 X1,则不要删除。只有当一个缺失而另一个不缺失时,才删除缺失的行。

预期输出

  Id    Date    Col1    Col2    Col3    X1
   1     1/1/22  0       0       1       6
   2     5/7/21  0       1       0       
   2     5/7/21  0       2       0     

我试过了

  library(tidyr)
  df %>%
  group_by(Id, Date) %>%
  drop_na(X1)

这会删除所有带有 NA 或缺失的行,而我只剩下一行,这不是我想要的。任何建议都非常适用。谢谢

如果 'X1' 中只有缺失值,我们可以在 filter 到 return all 行中创建一个条件,或者只是删除缺失的行

library(dplyr)
df %>% 
   group_by(Id, Date) %>% 
   filter(if(all(is.na(X1))) TRUE else complete.cases(X1)) %>%
   ungroup

-输出

# A tibble: 3 × 6
     Id Date    Col1  Col2  Col3    X1
  <int> <chr>  <int> <int> <int> <int>
1     1 1/1/22     0     0     1     6
2     2 5/7/21     0     1     0    NA
3     2 5/7/21     0     2     0    NA

或者没有 if/else,使用 |& 条件

df %>% 
  group_by(Id, Date) %>%
  filter(any(complete.cases(X1)) & complete.cases(X1) | 
       all(is.na(X1))) %>% 
  ungroup

数据

df <- structure(list(Id = c(1L, 1L, 2L, 2L), Date = c("1/1/22", "1/1/22", 
"5/7/21", "5/7/21"), Col1 = c(NA, 0L, 0L, 0L), Col2 = c(1L, 0L, 
1L, 2L), Col3 = c(0L, 1L, 0L, 0L), X1 = c(NA, 6L, NA, NA)), 
class = "data.frame", row.names = c(NA, 
-4L))