В tidyverse
мы можем использовать separate_rows
при преобразовании type
, чтобы разделить 'a' разделителем, затем arrange
столбцы 'b', 'a', сгруппированные по 'b' , paste
элементы 'a' в новом столбце и свяжите его с исходным набором данных
library(dplyr)
library(tidyr)
data_frame %>%
# // split a by the delimiter and expand the rows
separate_rows(a, convert = TRUE) %>%
# // order the columns
arrange(b, a) %>%
# // grouped by b
group_by(b) %>%
# paste the elements of a
# toString => paste(..., collapse=", ")
summarise(c = toString(a)) %>%
# // select the column c
select(c) %>%
# // bind with the original dataset
bind_cols(data_frame, .)
# A tibble: 2 x 3
# a b c
# <chr> <chr> <chr>
#1 2,29,3,30,31,4,5,2,28,29,3,30,4,5 x 2, 2, 3, 3, 4, 4, 5, 5, 28, 29, 29, 30, 30, 31
#2 12,13,14,15,18,19,20,12,13,14,15,18,19,20,21 y 12, 12, 13, 13, 14, 14, 15, 15, 18, 18, 19, 19, 20, 20, 21
Или используя strsplit
с map
. Мы разделяем строку 'a' на ,
, l oop на list
на map
, конвертируем в numeric
, sort
, а затем paste
в одну строку
library(purrr)
data_frame %>%
mutate(c = map_chr(strsplit(a, ","), ~
toString(sort(as.numeric(.x)))))
# A tibble: 2 x 3
# a b c
# <chr> <chr> <chr>
#1 2,29,3,30,31,4,5,2,28,29,3,30,4,5 x 2, 2, 3, 3, 4, 4, 5, 5, 28, 29, 29, 30, 30, 31
#2 12,13,14,15,18,19,20,12,13,14,15,18,19,20,21 y 12, 12, 13, 13, 14, 14, 15, 15, 18, 18, 19, 19, 20, 20, 21