将分隔的字符串拆分为R数据帧中的不同列

Gab*_*e B 2 substring r tokenize tm

我需要一种快速而简洁的方法将数据帧中的字符串文字拆分为一组列.假设我有这个数据框

data <- data.frame(id=c(1,2,3), tok1=c("a, b, c", "a, a, d", "b, d, e"), tok2=c("alpha|bravo", "alpha|charlie", "tango|tango|delta") )
Run Code Online (Sandbox Code Playgroud)

(请注意列之间的不同分隔符)

字符串列的数量通常是事先不知道的(尽管我可以尝试发现整个案例集,如果我没有其他选择)

我需要两个数据框,如:

tok1.occurrences:
    +----+---+---+---+---+---+
    | id | a | b | c | d | e | 
    +----+---+---+---+---+---+
    |  1 | 1 | 1 | 1 | 0 | 0 |
    |  2 | 2 | 0 | 0 | 1 | 0 |
    |  3 | 0 | 1 | 0 | 1 | 1 |
    +----+---+---+---+---+---+

tok2.occurrences:
    +----+-------+-------+---------+-------+-------+
    | id | alpha | bravo | charlie | delta | tango | 
    +----+-------+-------+---------+-------+-------+
    |  1 |   1   |   1   |    0    |   0   |   0   |
    |  2 |   1   |   0   |    1    |   0   |   0   |
    |  3 |   0   |   0   |    0    |   1   |   2   |
    +----+-------+-------+---------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

我尝试使用这种语法:

tok1.f = factor(data$tok1)
dummies <- model.matrix(~tok1.f)
Run Code Online (Sandbox Code Playgroud)

这最终导致了一个不完整的解决方案 它正确地创建了我的虚拟变量,但是(显然)没有分隔符分隔符.

我知道我可以使用'tm'包来查找文档术语矩阵,但对于这种简单的标记化来说似乎太过分了.有更直接的方式吗?

A5C*_*2T1 5

我能想到的最简单的事情就是结合使用我的cSplit函数dcast.data.table,如下所示:

library(splitstackshape)
dcast.data.table(cSplit(data, "tok1", ", ", "long"), 
                 id ~ tok1, value.var = "tok1", 
                 fun.aggregate = length)
#    id a b c d e
# 1:  1 1 1 1 0 0
# 2:  2 2 0 0 1 0
# 3:  3 0 1 0 1 1

dcast.data.table(cSplit(data, "tok2", "|", "long"), 
                 id ~ tok2, value.var = "tok2", 
                 fun.aggregate = length)
#    id alpha bravo charlie delta tango
# 1:  1     1     1       0     0     0
# 2:  2     1     0       1     0     0
# 3:  3     0     0       0     1     2
Run Code Online (Sandbox Code Playgroud)

编辑:已更新,library(splitstackshape)因为cSplit现在是该包的一部分.