5

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

1211 2234
1233 2348
.
.
.

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

4

4 回答 4

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 中获取其中的一部分。

于 2013-09-09T22:24:33.300 回答
2

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

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

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

于 2016-11-26T11:31:01.303 回答
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)
于 2013-09-09T19:31:04.373 回答
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.25 亿的 1%)125 万个整数值随机选择超过 1 :1.25e8。

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

于 2013-09-09T20:00:53.337 回答