我们可以使用unite 和separate_rows。 unite 列 'b'、'c'、'd' 到单个列 'x',然后使用 separate_rows 在默认分隔符 (_) 处拆分列,同时使用 @987654326 创建唯一的行 ID @,然后是 filter 我们有 'K'、'L'、'P' 元素的行,按 'rn' 分组,summarise by pasteing 'x' 中的 unique 元素
library(dplyr)
library(tidyr)
df %>%
unite(x, b, c, d) %>%
mutate(rn = row_number()) %>%
separate_rows(x) %>%
filter(x %in% c("K", "L", "P")) %>%
group_by(rn) %>%
summarise(a = first(a), x = toString(unique(x))) %>%
select(-rn)
# A tibble: 6 x 2
# a x
# <int> <chr>
#1 4 K
#2 6 L, K, P
#3 7 P
#4 0 L, K
#5 1 P
#6 0 K
或者另一个选项是pivot_longer
df %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = b:d, values_to = 'x') %>%
filter( x %in% c("K", "L", "P")) %>%
group_by(rn) %>%
summarise(a = first(a), x = toString(unique(x))) %>%
select(-rn)
数据
df <- structure(list(a = c(4L, 6L, 7L, 0L, 1L, 0L), b = c("K", "L",
"3", "L", "P", "K"), c = c("12", "K", "P", "90", "4", "17"),
d = c("6", "P", "1", "K", "5", "23")), class = "data.frame",
row.names = c(NA,
-6L))