我试图将一个从python导入的丑陋字符串强制到一个列表中,在列表中它可以占据data.table中的一个单元格。
为了更清楚地说明,我目前有一个.tsv,它的一些行如下所示:
1 2 [1, 2, 3, 4] 4
当我通过fread
导入它时,我为第三个元素(即dt[1,3] = "[1, 2, 3, 4]"
)提供了一个字符串。
我的当前解决方案是将这些项转换为带有regex的列表。例如:
dt[, newList := .(list(as.numeric(unlist(strsplit(gsub("\\[|\\]","", 3),",")))))]
但我觉得这是非常丑陋和不令人满意的。
有什么更优雅的方法吗?理想情况下,我还将替换原始变量,由于列类不同,目前不可能使用引用。
或者,是否有更好的方法可以使用python的嵌套列表导出.csv或.tsv,从而更好地将其读入R?
在这里,sep2
data.table参数似乎特别有用,但它尚未实现。
任何解决方案都将不胜感激!
发布于 2018-03-02 02:21:14
是的,我认为这肯定有点难看(请注意,我们必须使用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))]
不幸的是,您的示例太小了,因为不清楚要对多行的输入表做什么。
迟早会自动处理这个问题的sep2
参数..。
https://stackoverflow.com/questions/49061517
复制相似问题