我想分析Quicken 多年的家庭财务记录。我将文件导出到 qif 并使用 bank2csv 程序来呈现 csv。在 Quicken 中,可以使用一个类别(例如汽车、税收)、子类别(例如汽车:服务、汽车:燃料)和标签(例如自己、配偶、儿子)。 bank2csv 将类别:子类别/标签呈现为串联字符串。我想将类别放在类别列中,将子类别放在子类别列中,并将任何标签放在标签列中。我看到了 a similar question但可惜的是 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)
如何创建第三列和第四列:类别、标签。一些标签是
NA
我可以执行以下操作,但它并没有让我走得很远。我需要一种方法来指定结果列表的第一个或第二个元素(而不是整个列表)
dt[, category:= strsplit(x = category.tag, split = "/") ]
最佳答案
刚刚推送了两个功能 transpose()
和 tstrsplit()
在数据表 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
tstrsplit
是 transpose(strsplit(as.character(x), ...))
的包装器.你也可以通过fill=.
用除 NA
之外的任何其他值填充缺失值.transpose()
也可用于列表、数据框和数据表。
关于r - 使用 R 中的 data.table 将一列字符串拆分为可变数量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115832/