将字符串转换为列表并嵌套在 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
参数会自动处理...
我试图将一个从 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
参数会自动处理...