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)
只是把两种功能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()也可用于列表,数据框和数据表.