【问题标题】:How to Sample a specific proportion of lines from a big file in R?如何从 R 中的大文件中采样特定比例的行?
【发布时间】:2013-09-13 08:50:49
【问题描述】:

我有一个巨大的坐标文件,大约 1.25 亿行。我想对这些线条进行采样以获得所有线条的 1%,以便我可以绘制它们。有没有办法在 R 中做到这一点?该文件非常简单,只有 3 列,我只对前两列感兴趣。该文件的示例如下:

1211 2234
1233 2348
.
.
.

非常感谢任何帮助/指针。

【问题讨论】:

标签: r large-files sampling


【解决方案1】:

如果您想要选择一个固定的样本大小,并且您不提前知道文件有多少行,那么这里有一些示例代码将产生一个简单的随机数据样本,而不存储内存中的整个数据集:

n <- 1000
con <- file("jan08.csv", open = "r")
head <- readLines(con, 1)
sampdat <- readLines(con, n)
k <- n
while (length(curline <- readLines(con, 1))) {
    k <- k + 1
    if (runif(1) < n/k) {
        sampdat[sample(n, 1)] <- curline
    }
}
close(con)
delaysamp <- read.csv(textConnection(c(head, sampdat)))

如果您不止一次使用大型数据集,那么最好将数据读入数据库,然后从那里采样。

ff 包是将大型数据对象存储在文件中的另一种选择,但能够以简单的方式在 R 中获取其中的一部分。

【讨论】:

    【解决方案2】:

    LaF 包和 sample_line 命令是从文件中读取样本的一种选择:

    datafile <- "file.txt" # file from working directory
    sample_line(datafile, length(datafile)/100) # this give 1 % of lines 
    

    更多关于sample_linehttps://rdrr.io/cran/LaF/man/sample_lines.html

    【讨论】:

      【解决方案3】:

      据我了解您的问题,这可能会有所帮助

      > set.seed(1)
      > big.file <- matrix(rnorm(1e3, 100, 3), ncol=2) # simulating your big data
      > 
      > 
      > # choosing 1% randomly
      > one.percent <- big.file[sample(1:nrow(big.file), 0.01*nrow(big.file)), ]
                [,1]      [,2]
      [1,]  99.40541 106.50735
      [2,]  98.44774  98.53949
      [3,] 101.50289 102.74602
      [4,]  96.24013 104.97964
      [5,] 101.67546 102.30483
      

      然后你就可以绘制它了

      >  plot(one.percent)
      

      【讨论】:

        【解决方案4】:

        如果你不想将文件读入 R,像这样?

        mydata<-matrix(nrow=1250000,ncol=2)  # assuming 2 columns in your source file
        for (j in 1:1250000) mydata[j,] <- scan('myfile',skip= j*100 -1,nlines=1)
        

        加上文件中数据类型可能需要的任何参数、noheader 等。 如果您不想要均匀分布的样本,则需要生成(1.25 亿的 1%)在 1:1.25e8 上随机选择的 125 万个整数值。

        编辑:我很抱歉 - 我忽略了将 nlines=1 参数放在那里。

        【讨论】:

        • 请注意,您将通过这样做一遍又一遍地扫描(不断增长的位)文件,如果这比读取整个文件花费的时间更长,我不会感到惊讶尺寸
        • 如果我错了,请纠正我,但您不能在scan() 中指定要读取的非连续行。
        • @Ferdinand.kraft 我的不好的编辑添加nlines=1。当然这可能很慢 - 可能应该 open 文件并保持打开状态直到完成。
        猜你喜欢
        • 2017-11-26
        • 2020-02-12
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 2015-06-04
        • 2019-07-14
        • 1970-01-01
        相关资源
        最近更新 更多