我有一个数据框
a = data.frame("a" = c("aaa|abbb", "bbb|aaa", "bbb|aaa|ccc"), "b" = c(1,2,3))
a b
aaa|abbb 1
bbb|aaa 2
bbb|aaa|ccc 3
我想用“ |”分隔列值并对输出进行排序,然后将它们合并在一起,就像这样
a b
aaa|abbb 1
aaa|bbb 2
|aaa|bbb|ccc 3
我尝试使用以下
paste(sort(ignore.case(unlist(strsplit(as.character(a$a), "\\|")))),collapse = ", ")
但这只是将所有内容组合在一起。如何在列A的每个值上实现它,并将结果作为数据框获取。我尝试使用lapply,但仍然得到相同的结果,一个合并的列表。
答案 0 :(得分:4)
我们可以使用separate_rows
将值拆分为'a',然后按'b',sort
'a'和paste
元素分组
library(tidyverse)
a %>%
separate_rows(a) %>%
group_by(b) %>%
summarise(a = paste(sort(a), collapse="|")) %>%
select(names(a))
# A tibble: 3 x 2
# a b
# <chr> <dbl>
#1 aaa|abbb 1
#2 aaa|bbb 2
#3 aaa|bbb|ccc 3
答案 1 :(得分:3)
基于R的想法
sapply(strsplit(as.character(a$a), '|', fixed = TRUE), function(i) paste(sort(i), collapse = '|'))
#[1] "aaa|abbb" "aaa|bbb" "aaa|bbb|ccc"
因此要更新您的列a,只需将其分配回它,即
a$a <- sapply(strsplit(as.character(a$a), '|', fixed = TRUE), function(i) paste(sort(i), collapse = '|'))
答案 2 :(得分:3)
类似于索托斯的答案:
a$clean <- sapply(as.character(a$a), function(i) paste(sort(tolower(unlist(strsplit(i, split = "|", fixed = TRUE)))), collapse = "|"))
# a b clean
# 1 aaa|abbb 1 aaa|abbb
# 2 bbb|aaa 2 aaa|bbb
# 3 bbb|aaa|ccc 3 aaa|bbb|ccc
答案 3 :(得分:3)
如果要使用data.table
library(data.table)
dat <- fread("a b
aaa|abbb 1
bbb|aaa 2
bbb|aaa|ccc 3")
dat[,a_sorted :=sapply(lapply(strsplit(a, "\\|"), sort),paste,collapse="|") ]