如何从R中的大文件中抽取特定比例的行?

时间:2013-09-09 19:25:23

标签: r large-files sampling

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

1211 2234
1233 2348
.
.
.

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

4 个答案:

答案 0 :(得分:4)

如果你想要选择一个固定的样本量并且你不知道该文件有多少行,那么下面是一些示例代码,它将导致数据的简单随机样本而不存储内存中的整个数据集:

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中获取部分数据对象。

答案 1 :(得分:2)

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

day | totaView1 | totalView2 | totalView3 | totalView1+view2 |totalOfViews
2016-11-23 | 1 | 1 | 0 | 2 | 2
2016-11-22 | 1 | 3 | 0 | 4 | 4
2016-11-21 | 1 | 0 | 2 | 1 | 3

有关 sample_line 的更多信息:https://rdrr.io/cran/LaF/man/sample_lines.html

答案 2 :(得分:1)

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

> 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)

答案 3 :(得分:0)

如果您不想将文件读入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.2百万的1%)125万个随机选择1:1.25e8的整数值。

编辑:道歉 - 我忽略了将nlines=1论点放在那里。