用R中的动态列名称将数据帧字符列拆分为任意数量的列

时间:2019-03-05 00:14:00

标签: r dataframe split reshape

我目前有一个带有字符列的数据框,其中嵌入了不同的列数据:

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 :(得分:0)

我认为最好是使用purrr:map_dfr()处理strsplit()输出。它允许对列表元素进行任意操作,并将结果按行绑定到数据帧中。另外,我将使用purrr::transpose()将对的列表翻转为列表对,并使用purrr::as_vector()将列表转换为向量。

假设第一位和最后一位始终分别进入columnType,则解决方案是:

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')
  })