过滤数据但至少为每个 ID 保留一行
Filter data but keep at least one row for each ID
在此示例数据中,我想过滤掉 col1
和 col2
均为零的那些行。
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
在此示例数据中,我想过滤掉 col1
和 col2
均为零的那些行。
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