过滤数据但至少为每个 ID 保留一行

Filter data but keep at least one row for each ID

在此示例数据中,我想过滤掉 col1col2 均为零的那些行。

df <- data.frame(
  id = rep(letters[1:3], each = 2),
  col1 = c(1, 1, 0, 0, 0, 0),
  col2 = c(0, 1, 0, 0, 1, 0),
  col3 = LETTERS[1:6]
)

这是我试过的:

library(dplyr)

df %>%
  filter(col1 == 1 | col2 == 1)

#   id col1 col2 col3
# 1  a    1    0    A
# 2  a    1    1    B
# 3  c    0    1    E

它工作正常,但是 id"b" 的所有行都被删除了。有什么方法可以让每个 id 至少保留一行?我的预期输出是:

#   id col1 col2 col3
# 1  a    1    0    A
# 2  a    1    1    B
# 3  b   NA   NA    -
# 4  c    0    1    E

您可以使用 tidyr::complete():

df %>%
  filter(col1 == 1 | col2 == 1) %>%
  tidyr::complete(id = df$id, fill = list(col3 = "-"))

# # A tibble: 4 × 4
#   id     col1  col2 col3 
#   <chr> <dbl> <dbl> <chr>
# 1 a         1     0 A    
# 2 a         1     1 B    
# 3 b        NA    NA -    
# 4 c         0     1 E