将大 csv 文件中的小随机样本加载到 R 数据框中

Posted

技术标签:

【中文标题】将大 csv 文件中的小随机样本加载到 R 数据框中【英文标题】:Load a small random sample from a large csv file into R data frame 【发布时间】:2014-04-11 05:58:46 【问题描述】:

要处理的 csv 文件不适合内存。如何读取大约 20K 的随机行来对所选数据帧进行基本统计?

【问题讨论】:

一个previous answer 【参考方案1】:

根据sqldf github home page 上的示例 6e 和 6f 试试这个:

library(sqldf)
DF <- read.csv.sql("x.csv", sql = "select * from file order by random() limit 20000")

请参阅?read.csv.sql,根据您的文件的具体情况,根据需要使用其他参数。

【讨论】:

【参考方案2】:

如果您的数据中有 ID 或类似内容,则可以使用以下内容。 获取 ID 样本,然后使用采样的 ID 获取数据子集。

sampleids <- sample(data$id,1000)
newdata <- subset(data, data$id %in% sampleids)

【讨论】:

如果如 OP 所说,“要处理的 csv 文件不适合内存”,则根本没有帮助。【参考方案3】:

你也可以在终端中使用 perl 来完成。

perl -ne 'print if (rand() &lt; .01)' biglist.txt &gt; subset.txt

这不一定会得到 20,000 行。 (这里它会占用大约 0.01 或 1% 的总行数。)然而,它会非常快,并且您将在目录中拥有这两个文件的一个很好的副本。然后,您可以根据需要将较小的文件加载到 R 中。

【讨论】:

不错,有什么办法可以保留 csv 标头? @pomber 你可以先复制标题行(例如head -1 file.txt &gt; sample.txt)然后用&gt;&gt; 运行perl 操作而不是追加 有没有办法用 Python 做到这一点? 对于 Windows,您需要将 ' 更改为 " 尝试使用 csv 作为大文件,但它复制了整个文件。【参考方案4】:

这应该可行:

RowsInCSV = 10000000 #Or however many rows there are

List <- lapply(1:20000, function(x) read.csv("YourFile.csv", nrows=1, skip = sample(1, RowsInCSV), header=F)
DF = do.call(rbind, List)

【讨论】:

它和 Perl 一样快吗? 怀疑。在我的机器上大约需要 6 秒,所以除非你必须一直这样做,否则这并没有什么不同。 会不会是示例函数中的参数颠倒了?样本(RowsInCSV,1)?此外,我认为 lapply 命令末尾的括号丢失了。

以上是关于将大 csv 文件中的小随机样本加载到 R 数据框中的主要内容,如果未能解决你的问题,请参考以下文章

从R中的大型.CSV导入和提取随机样本

从 R 中的大型 .CSV 导入和提取随机样本

R数据框用随机样本数据填充命名列

将大型 csv 加载到数据框中,同时保持列结构

如何避免将大文件重复加载到 python 脚本中?

从 csv 文件生成随机样本,同时跳过具有某些值的行