Манипулировать строкой в ​​столбце данных - PullRequest
5 голосов
/ 06 марта 2019

У меня есть фрейм данных

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 ]

4 голосов
/ 06 марта 2019

Мы могли бы использовать 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
3 голосов
/ 06 марта 2019

, если вы хотите сделать это с 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="|") ]
3 голосов
/ 06 марта 2019

Аналогично ответу Сотоса:

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 голосов
/ 06 марта 2019

Идея через базу 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 = '|'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...