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

Convert string to list and nest in data.table

我试图将一个从 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),",")))))]

但我觉得这非常丑陋和令人不满意。

有没有更优雅的方式来做到这一点?理想情况下,我还会替换原始变量,由于列 类 不同,目前无法通过引用替换原始变量。

或者,是否有更好的方法可以从 python 中导出带有嵌套列表的 .csv 或 .tsv,以便更好地读取 R?

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

任何解决方案将不胜感激!

是的,我认为它肯定有点难看(注意我们必须使用 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))]

不幸的是,您的示例 太小了,因为不清楚您想对超过一行的输入 table 做什么。

迟早,fread will support a sep2 参数会自动处理...