Разделение символьного столбца фрейма данных на произвольное количество столбцов с динамическими именами столбцов в R - PullRequest
0 голосов
/ 05 марта 2019

В настоящее время у меня есть фрейм данных с символьным столбцом, в который вставлены различные данные столбца:

column
Name1 A=a;B=b;C=c;X
Name2 A=a;C=c;D=d;E=e;X
Name3 Y
Name4 A=z;B=y;Z
...
NameN E=f;X

Разные биты данных в этом столбце произвольны без определенного порядка.Я выяснил, как превратить столбец в список (то есть, используя stringr :: str_split), например:

[[1]]
[1] "Name1"  "A=a"  "B=b"  "C=c"  "X"
[[2]]
[1] "Name2"  "A=a"  "C=c"  "D=d"  "E=e"  "X"
[[3]]
[1] "Name3"  "Y"
[[4]]
[1] "Name4"  "A=z"  "B=y"  "Z"
...
[[N]]
[1] "NameN"  "E=f"  "X"

Но, учитывая, что некоторые из встроенных столбцов находятся только в некоторых строках, это не может бытьлегко приводить в качестве фрейма данных, особенно без предварительного знания имен новых столбцов.

Желаемый результат будет:

column  A  B  C  D  E ... Type
Name1   a  b  c  NA NA... X
Name2   a  NA c  d  e ... X
Name3   NA NA NA NA NA... Y
Name4   z  y  NA NA NA... Z
...
NameN   NA NA NA NA f ... X

1 Ответ

0 голосов
/ 05 марта 2019

Я думаю, лучше всего будет использовать purrr:map_dfr() для обработки strsplit() вывода.Он допускает произвольную операцию с элементами списка и связывает результаты по строкам в ряд данных.Кроме того, я буду использовать purrr::transpose() для перелистывания списка пары в пару списков и purrr::as_vector() для преобразования списка в вектор.

Предполагая, что первый и последний бит всегда входят в column и Typeсоответственно решение:

library(purrr)

column %>%
  strsplit(' |;') %>%
  map_dfr(~{
    column <- .x[1]
    Type <- .x[length(.x)]

    bits <- .x[-c(1,length(x))] %>%
              strsplit('=') %>%
              transpose()

    result <- c(colimn, bits[[2]], Type)
    names(results) <- c('colimn', as_vector(bits[[1]]), 'Type')
  })
...