所以我在这个结构中有一个包含值的列:
tribble(
~col,
"AA_BB;AA_AA;AA_BB",
"BB_BB;AA_AA",
"AA_BB",
"BB_AA;BB_AA;AA_AA;BB_AA")
)
所以每行都有用";"分隔的项。第一个for包含条目AA_BB、AA_AA和AA_BB。我想把第一行转换成"AA_BB; aa_aaa "并将最后一行转换为"BB_AA; aa_aaa "
我考虑过使用separate,但是我的结果并没有真正帮助我(特别是因为我不知道最多可以有多少列)。
df %>%
separate(col, into = c("A", "B", "C", "D"), sep = ";")
关于如何做到这一点有什么建议吗?
我们可以拆分列,得到unique
元素和paste
library(dplyr)
library(stringr)
library(purrr)
df %>%
mutate(col = map_chr(strsplit(col, ";"), ~ str_c(unique(.x), collapse=";")))
与产出
# A tibble: 4 x 1
# col
# <chr>
#1 AA_BB;AA_AA
#2 BB_BB;AA_AA
#3 AA_BB
#4 BB_AA;AA_AA
或与separate_rows
分开,然后在获得distinct
行后由paste
进行分组
library(tidyr)
df %>%
mutate(rn = row_number()) %>%
separate_rows(col, sep=";") %>%
distinct %>%
group_by(rn) %>%
summarise(col = str_c(col, collapse=";"), .groups = 'drop') %>%
select(col)
在base R中,您可以使用分号分隔字符串,只保留唯一的字符串并将它们粘贴在一起。
df$col1 <- sapply(strsplit(df$col, ';'), function(x)
paste0(unique(x), collapse = ';'))
df
# A tibble: 4 x 2
# col col1
# <chr> <chr>
#1 AA_BB;AA_AA;AA_BB AA_BB;AA_AA
#2 BB_BB;AA_AA BB_BB;AA_AA
#3 AA_BB AA_BB
#4 BB_AA;BB_AA;AA_AA;BB_AA BB_AA;AA_AA