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

标签 r string data.table

我想分析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
tstrsplittranspose(strsplit(as.character(x), ...)) 的包装器.你也可以通过fill=.用除 NA 之外的任何其他值填充缺失值.
transpose()也可用于列表、数据框和数据表。

关于r - 使用 R 中的 data.table 将一列字符串拆分为可变数量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115832/

相关文章:

ruby - 在 Ruby 中使用 R 的最佳方式

r - 为什么 lmList 与 lmList[[x]] 得到不同的汇总结果

python - 拆分小写和大写联合的句子

对巨大数据集进行重复连接

r - 如何在 `data.table`中加入有最小数据量的条件来计算一个变量

r - R中的多核和data.table

roxygen2:导出打印方法的问题

r - 如何避免R中的内存限制

java - 我们如何创建一个算法来检查一个字符串是否是两个字符串合并的结果?

string - 计数没有。 O(n) 中的单词