r语言 - 如何获得这些由";"分隔的字符串的唯一出现次数?



所以我在这个结构中有一个包含值的列:

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

最新更新