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

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

【问题讨论】:

标签: r csv random dataframe bigdata


【解决方案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 命令末尾的括号丢失了。
    猜你喜欢
    • 2014-04-11
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多