如何将数据表的列中的逗号分隔字符串分隔为多个列

时间:2018-01-19 08:01:41

标签: r data.table stringr

我有一个数据表,其中一列有逗号分隔的整数字符串,长度不同。我希望每个元素都成一个单独的列。我尝试了stringr::str_extract和基地strsplit;两者都不适用于这种情况。它们垂直向量而不是水平向量。如何水平或对逗号分隔的字符串的每个元素进行矢量化?

这是一个可复制的例子。

考虑一个包含2列的简单数据表

set.seed(10)
r<-vector(mode = "character",length = 10)
for(i in 1:5) r[i]=paste(sample(10,4),collapse = ",")
set.seed(10)
for(i in 6:10) r[i]=paste(sample(10,2),collapse = ",")
dt1=data.table(sn=1:10,col=r)
dt1
    sn     col
 1:  1 6,3,4,5
 2:  2 1,3,9,2
 3:  3 7,4,6,9
 4:  4 2,6,3,4
 5:  5 1,3,4,6
 6:  6     6,3
 7:  7     5,7
 8:  8     1,3
 9:  9    3,10
10: 10     7,4

我需要一个转换的数据表,其第一行为

 1: sn=1, col="6,3,4,5", col1=6, col2=3,col3=4,col4=5

和第10行

10: sn=10,col="7,4",col1=7,col2=4,col3=NA,col4=NA

我试过了,

data.table(sn=dt1$sn,col=dt1$col,col1=strsplit(dt1$col,","))

,或者

dt1[,.(sn,col,col1=str_split(col,pattern = ","))]

,或者

dt1[,.(sn,col,col1=str_extract_all(col,pattern = "\\d+")[1],col2=str_extract_all(col,pattern = "\\d+")[2])]

但所有这些都是矢量化的,我在每行和每列中都得到逗号分隔的字符串。

我的问题是如何使用for loop将逗号分隔的字符串分开,并将它们存储为data.table中的不同列?即使您将data.table融合成多行,每个元素对应一个元素,将值存储在相同的列名col中但存储在不同的行中,我将很高兴。

我无法在SO上得到任何相关问题,或者至少搜索没有提出与我的问题相符的结果。

PS。对于任何可以指导我创建示例data.table而不使用我所做的5行代码的人来说,这是一个额外的upvote。它看起来很长而且很长它使用for循环: - )

0 个答案:

没有答案