[英]Combine selected values across columns into one column
我有一個 dataframe df
,其中:
a b c d
4 K 12 6
6 L K P
7 3 P 1
0 L 90 K
1 P 4 5
0 K 17 23
如何將兩列b
、 c
和d
合並到一個名為x
的新列中,這樣它只保留字母K
、 L
和P
看起來像這樣:
a x
4 K
6 L, K, P
7 P
0 L, K
1 P
0 K
我們可以將unite
與separate_rows
一起使用。 將列 'b'、'c'、'd' unite
為單個列 'x',然后在默認分隔符 ( _
) 處使用separate_rows
的行拆分列,同時使用row_number
創建唯一的行 ID,然后filter
我們所在的行有 'K', 'L', 'P' 元素,按 'rn' 分組,通過paste
'x' 中的unique
元素進行summarise
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))
如果您想排除所有數字,另一種解決方案是
df %>%
mutate(x = purrr::pmap_chr(list(b,c,d),
~ paste0(c(..1, ..2, ..3) %>%
.[!grepl("^[0-9]{1,}$", .)],
collapse = ", ")))
或者如果你只想保留 K、L 和 P
df %>%
mutate(x = purrr::pmap_chr(list(b,c,d),
~ paste0(c(..1, ..2, ..3) %>%
.[. %in% c("K","L","P")],
collapse = ", ")))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.