将大 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() < .01)' biglist.txt > subset.txt
这不一定会得到 20,000 行。 (这里它会占用大约 0.01 或 1% 的总行数。)然而,它会非常快,并且您将在目录中拥有这两个文件的一个很好的副本。然后,您可以根据需要将较小的文件加载到 R 中。
【讨论】:
不错,有什么办法可以保留 csv 标头? @pomber 你可以先复制标题行(例如head -1 file.txt > sample.txt
)然后用>>
运行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 数据框中的主要内容,如果未能解决你的问题,请参考以下文章