我正在尝试将从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参数在这里特别有用,但它尚未实现。
非常感谢任何解决方案!
答案 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
论证自动处理这个问题......