将字符串转换为列表并嵌套在data.table中

时间:2018-03-02 01:43:06

标签: r regex data.table nested-lists

我正在尝试将从python导入的丑陋字符串强制转换为可以占用data.table中的单元格的列表。

为了更清楚,我目前有一个.tsv,它有一些看起来像这样的行:

1    2    [1, 2, 3, 4]    4

当我通过fread导入时,我最终得到第三个元素的字符串(即dt[1,3] = "[1, 2, 3, 4]")。

我目前的解决方案是将这些项目转换为带有正则表达式的列表。例如:

dt[, newList := .(list(as.numeric(unlist(strsplit(gsub("\\[|\\]","", 3),",")))))]

但我发现这非常难看并且不满意。

有更优雅的方式吗?理想情况下,我也会替换原始变量,由于不同的列类,这个变量目前无法通过引用实现。

或者,有没有更好的方法可以导出.csv或.tsv与python的嵌套列表,以便更好地读入R?

似乎sep2 data.table参数在这里特别有用,但它尚未实现。

非常感谢任何解决方案!

1 个答案:

答案 0 :(得分:3)

是的,我认为它有点难看(注意我们必须使用as.list来表示:=列类型发生了变化):

DT = data.table(a = 1, b = 2, c = '[1, 2, 3, 4]', d = 4)
DT[ , c := as.list(lapply(
  strsplit(gsub('[][]', '', c), ',', fixed = TRUE),
  as.integer))]

不幸的是,您的示例最小,因为您不清楚您想要为多行输入表做什么。

迟早会fread will support a sep2论证自动处理这个问题......