gpt4 book ai didi

当较大的行没有出现在文件的早期时,R data.table fread 无法读取不规则的列长度

转载 作者:行者123 更新时间:2023-12-03 20:04:20 25 4
gpt4 key购买 nike

我想使用 data.table 函数 fread 读取一个 csv 文件。 csv 文件有大量的 9 列记录,随后有大量的 10 列记录。使用参数 fill=TRUE 不能解决问题。以下是一些示例数据,可以说明我的问题:

library(data.table)
short <- rep("1,1,1", 1000)
long <- rep("1,1,1,2", 1000)
write(c(short, long), "shortLong.csv")
write(c(long, short), "longShort.csv")

当我读入具有短列长度和长列长度的文件时,出现此错误:

fread("shortLong.csv", fill=TRUE)
Error in fread("shortLong.csv", fill = TRUE) :
Expecting 3 cols, but line 1001 contains text after processing all cols. Try again with fill=TRUE. Another reason could be that fread's logic in distinguishing one or more fields having embedded sep=',' and/or (unescaped) '\n' characters within unbalanced unescaped quotes has failed. If quote='' doesn't help, please file an issue to figure out if the logic could be improved

但是,当我读取具有长列长度和短列长度的文件时,它可以毫无问题地读取文件,并用 NA 填充短列中的缺失值>,这就是我想要的:

fread("longShort.csv", fill=TRUE)
V1 V2 V3 V4
1: 1 1 1 2
2: 1 1 1 2
3: 1 1 1 2
4: 1 1 1 2
5: 1 1 1 2
---
1996: 1 1 1 NA
1997: 1 1 1 NA
1998: 1 1 1 NA
1999: 1 1 1 NA
2000: 1 1 1 NA

这个错误似乎是由于长列之前有大量短列引起的,因为当我将短列和长列混合在一起时没有问题:

mixed <- rep(c("1,1,1", "1,1,1,2"), 1000)
write(mixed, "mixed.csv")
fread("mixed.csv", fill=TRUE)
V1 V2 V3 V4
1: 1 1 1 NA
2: 1 1 1 2
3: 1 1 1 NA
4: 1 1 1 2
5: 1 1 1 NA
---
1996: 1 1 1 2
1997: 1 1 1 NA
1998: 1 1 1 2
1999: 1 1 1 NA
2000: 1 1 1 2

我怀疑这种行为上的差异可能是因为 fread 会提前分配列但不会查看整个文件并根据最长看​​到的设置最大列号(我不是很熟悉然而,函数的内部工作原理)。

有什么方法可以使用 fread 正确读取我的数据吗?我想我可以将一些 hacky 解决方案放在一起并绕过 fread,但我喜欢这种性能并且我不想大幅降低我的代码速度。谢谢!

最佳答案

请注意,您拥有的是不是 csv 文件,因为它没有标题。如果我们添加标题,它将起作用。首先使用 fread 将其作为每行的单个字段读入,给出字符向量 Lines。从中计算字段的最大数量 n。最后在添加标题前缀后重新阅读 Lines

Lines <- fread("shortLong.csv", sep = "")[[1]]
n <- max(count.fields(textConnection(Lines), sep = ","))
fread(text = c(toString(1:n), Lines), header = TRUE, fill = TRUE)

关于当较大的行没有出现在文件的早期时,R data.table fread 无法读取不规则的列长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com