我目前有一个带有字符列的数据框,其中嵌入了不同的列数据:
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
答案 0 :(得分:0)
我认为最好是使用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')
})