gpt4 book ai didi

R - sqldf() 返回零行数据框

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

我正在尝试使用描述的方法从非常大的 csv 文件中读取选择数据的有效方法 here通过@JD_Long。该方法依赖于同名库中的 sqldf() 函数。我遇到的问题是该函数返回一个空数据框,该数据框具有正确的列数及其名称,但行数为零。

一旦数据帧被 sqldf() 读入工作环境,我已经截断了用于处理数据帧的格式化函数。

sum_stats_df <- function(f_name){
# read in data
f <- file(f_name, open = "r")
df <- sqldf("select * from f limit 6", dbname = tempfile(),
file.format = list(header = T, row.names = F))
close(f, type='r')
return(df)

我正在使用的 csv 数据集是我从 ASA 网站下载的著名的交通统计局航类数据 here .

我尝试了上面链接的 StackOverflow 问题中的示例代码。

bigdf <- data.frame(dim=sample(letters, replace=T, 4e7), fact1=rnorm(4e7), fact2=rnorm(4e7, 20, 50))
write.csv(bigdf, 'bigdf.csv', quote = F)
library(sqldf)
f <- file("bigdf.csv")
bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F))

当我调用 sum_stats_df("bigdf.csv") 时它工作得很好。我尝试使用 Windows 文件资源管理器中的属性查看模拟文件和航类 csv 文件的属性,但它们看起来是相同的信息格式。唯一的区别是文件大小。航类文件要大得多,但我不明白这有什么关系。

我尝试的下一件事是使用 read.csv(..., nrow=20) 加载其中一个航类 csv 文件的二十行,然后获取生成的数据帧并将其写回到 csv 文件。当我在那个新的 csv 测试文件上尝试有问题​​的函数时,它起作用了。

> print(head(sum_stats_df("test.csv")))
X Year Month DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier
1 "1" 1987 10 14 3 741 730 912 849 "PS"
2 "2" 1987 10 15 4 729 730 903 849 "PS"
3 "3" 1987 10 17 6 741 730 918 849 "PS"
4 "4" 1987 10 18 7 729 730 847 849 "PS"
5 "5" 1987 10 19 1 749 730 922 849 "PS"
6 "6" 1987 10 21 3 728 730 848 849 "PS"

但是,同样,使用原始 csv 文件的调用返回一个空数据帧。

> print(head(sum_stats_df("2000.csv")))
[1] Year Month DayofMonth DayOfWeek DepTime
[6] CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum
[11] TailNum ActualElapsedTime CRSElapsedTime AirTime ArrDelay
[16] DepDelay Origin Dest Distance TaxiIn
[21] TaxiOut Cancelled CancellationCode Diverted CarrierDelay
[26] WeatherDelay NASDelay SecurityDelay LateAircraftDelay
<0 rows> (or 0-length row.names)

所以我想知道我从 ASA 下载的 csv 文件与我使用 write.csv() 在本地编写的文件有何不同? sqldf() 返回空数据帧但获取所有列名的其他原因可能是什么?

最佳答案

SQLite 对行尾字符很挑剔,如果文件来自其他地方,这些字符可能与操作系统上的默认值不同。

在 Windows 和 Linux Ubuntu 上这对我有用,假设你已经解压了它:

read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n")

或在 Windows 上使用原始 bz2 文件并假设 7z 可执行文件在您的路径上:

read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "7z x -so 1987.csv.bz2 2>NUL")

在 Linux 上我们可以使用 bzip2 代替:

read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "bzip2 -cd 1987.csv.bz2")

关于 sqldf github page 的常见问题解答 16有一个与这个非常相似的例子。

关于R - sqldf() 返回零行数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161683/

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