Мы можем использовать unite
с separate_rows
. unite
столбцы 'b', 'c', 'd' в один столбец 'x', затем разделите столбец по разделителю по умолчанию (_
) на separate_rows
при создании уникального идентификатора строки с row_number
, затем filter
строки, в которых есть элементы 'K', 'L', 'P', сгруппированные по 'rn', summarise
по paste
с добавлением unique
элементов в 'x'
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))