我有一个巨大的坐标文件,大约 1.25 亿行。我想对这些线条进行采样以获得所有线条的 1%,以便我可以绘制它们。有没有办法在 R 中做到这一点?该文件非常简单,只有 3 列,我只对前两列感兴趣。该文件的示例如下:
1211 2234
1233 2348
.
.
.
任何帮助/指针都非常感谢。
我有一个巨大的坐标文件,大约 1.25 亿行。我想对这些线条进行采样以获得所有线条的 1%,以便我可以绘制它们。有没有办法在 R 中做到这一点?该文件非常简单,只有 3 列,我只对前两列感兴趣。该文件的示例如下:
1211 2234
1233 2348
.
.
.
任何帮助/指针都非常感谢。
如果您要选择一个固定的样本大小,并且您不提前知道文件有多少行,那么这里有一些示例代码将产生一个简单的随机数据样本,而不会将整个数据集存储在记忆:
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 中获取其中的一部分。
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
据我了解您的问题,这可能会有所帮助
> 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)
如果您不想将文件读入 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
论点放在那里。