操作数据框列中的字符串

时间:2019-03-06 15:22:10

标签: r dataframe

我有一个数据框

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,但仍然得到相同的结果,一个合并的列表。

4 个答案:

答案 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="|") ]