2013-09-09 2 views
4

У меня есть огромный файл координат около 125 миллионов строк. Я хочу пробовать эти строки, чтобы получить 1% всех строк, чтобы я мог их построить. Есть ли способ сделать это в R? Файл очень прост, он имеет только 3 столбца, и меня интересуют только первые два. Образец файла будет выглядеть следующим образом:Как указать конкретную пропорцию строк из большого файла в R?

1211 2234 
1233 2348 
. 
. 
. 

Любая помощь/указатель высоко оценена.

+1

Я думаю, что вы хотите, это - HTTP: // StackOverflow. com/a/15798275/817778 – eddi

+1

или [другой ответ на тот же вопрос] (http://stackoverflow.com/questions/15532810/reading-40-gb-csv-file-into-r-using-bigmemory/18282037 # 18282037), который является чистым R-решением –

ответ

1

Насколько я undertood ваш вопрос, это может быть полезным

> 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) 
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% от 125 млн) 1,25 миллиона целых значений, случайным образом выбранных за 1: 1,25e8.

EDIT: мои извинения. Я пренебрег аргументом nlines=1.

+0

, обратите внимание, ll продолжать сканирование (когда-либо растущие бит) файла снова и снова, делая это, и я не удивлюсь, если это заняло больше времени, чем чтение всего файла для некоторых размеров. – eddi

+0

Исправьте меня, если я ошибаюсь, но вы не можете указать несмежные строки, которые нужно читать в 'scan()'. –

+0

@ Ferdinand.kraft мои исправления, чтобы добавить 'nlines = 1'. Конечно, это может быть медленным - возможно, нужно «открыть» файл и держать его открытым до завершения. –

3

Если у вас есть фиксированный размер выборки, который вы хотите выбрать, и вы не знаете заранее, сколько строк имеет файл, то вот пример кода, который приведет к простому случайному образцу данных без сохранения весь набор данных в памяти:

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.

+0

Это отличный маленький кусок кода. Спасибо! – Zach

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

Смежные вопросы