使用R中的data.table将一列字符串拆分为可变数量的列

Far*_*rel 3 string r data.table

我想分析许多年的Quicken家庭财务记录.我将文件导出到qif并使用bank2csv程序渲染csv.在Quicken中,可以使用类别(例如汽车,税收),子类别(例如汽车:服务,汽车:燃料)和标签(例如自己,配偶,儿子).bank2csv将类别:subcategories/tag呈现为连接字符串.我想将类别放在子类列中的类别列子类别中,并在标记列中放置任何标记.我看到了一个类似的问题,但可惜的是通过工作strsplit,然后unlist再建立索引,以便它可以通过转让被写入到正确的位置的每个元素.这在这里不起作用,因为有时没有标签,有时没有子类别.将字符串拆分为列表并将该列表保存在列中非常容易,但实际上如何将列表的第一个元素分配给一个列,将第二个元素(如果存在)分配给第二列.当然有一种优雅简单的方式.

简化样本

library(data.table)
library(stringi)
dt <- data.table(category.tag=c("toys/David", "toys/David", "toys/James", "toys", "toys", "toys/James"), transaction=1:6)
Run Code Online (Sandbox Code Playgroud)

如何创建第三列和第四列:category,tag.一些标签将是NA

我可以做到以下但是它不会让我走得很远.我需要一种方法来指定结果列表的第一个或第二个元素(而不是整个列表)

dt[, category:= strsplit(x = category.tag, split = "/") ]
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 6

只是把两种功能transpose(),并tstrsplit()在data.table v1.9.5.

有了这个,我们可以做到:

require(data.table)
dt[, c("category", "tag") := tstrsplit(category.tag, "/", fixed=TRUE)]
#    category.tag transaction category   tag
# 1:   toys/David           1     toys David
# 2:   toys/David           2     toys David
# 3:   toys/James           3     toys James
# 4:         toys           4     toys    NA
# 5:         toys           5     toys    NA
# 6:   toys/James           6     toys James
Run Code Online (Sandbox Code Playgroud)

tstrsplit是一个包装transpose(strsplit(as.character(x), ...)).并且您还可以传递fill=.以使用任何其他值填充缺失值NA.

transpose()也可用于列表,数据框和数据表.