2015-05-29 4 views
4

У меня есть большой CSV-файл, и я хочу импортировать только определенные строки, если это так. Сначала я создаю индексы строк, которые будут импортированы, тогда я хочу передать имена этих строк в sqldf и вернуть полные записи для указанных строк.Выберите указанные строки при импорте CSV

#create the random rows ids that will be sampled 
library(dplyr) 
#range for the values 
index<-c(1:20) 
index<-as.data.frame(as.matrix(index)) 
#number of values to be returned 
number<-5 
ids<-sample_n(index,number) 

#sample the data 
library(sqldf) 
#filepath 
f<-file("/Users/.../filename.csv") 
#select data  
df<-sqldf("select * from f") 

Как импортировать ряд строк из файла CSV, указав номера строк?

+2

Какой вопрос? – zx8754

+1

Как импортировать ряд строк из файла CSV, указав номера строк. – SharkSandwich

+0

[Соответствующий пост: самый быстрый способ прочитать подмножество строк CSV] (http://stackoverflow.com/a/25244592/680068) – zx8754

ответ

3

Попробуйте этот пример:

library(sqldf) 

#dummy csv 
write.csv(data.frame(myid=1:10,var=runif(10)),"temp.csv") 

#define ids 
ids <- c(1,3,4) 
ids <- paste(ids,collapse = ",") 

f <- file("temp.csv") 

#query with subset 
fn$sqldf("select * 
      from f 
      where myid in ($ids)", 
      file.format = list(header = TRUE, sep = ",")) 

#output 
#  X myid  var 
# 1 "1" 1 0.2310945 
# 2 "3" 3 0.8825055 
# 3 "4" 4 0.6655517 

close(f) 
+0

@ G.Grothendieck, по какой-то причине я не мог передать внешнюю переменную для IN оператора, поэтому вместо этого используется 'paste'. – zx8754

+1

Спасибо. Я пытался что-то подобное, но не мог заставить условие «где» работать. – SharkSandwich

+0

@ G.Grothendieck Да, это работает (обновляется сообщение), я хотел сказать, избегать обрушения идентификаторов в строку. – zx8754

1

может быть что-то baseR как это ...

# dummy csv 
write.csv(data.frame(myid=1:10, var=runif(10)),"temp.csv") 

# define ids 
ids <- c(1,3,4) 

# reading from line 3 to 4/reading 2 lines 
read.table("temp.csv", header=T, sep=",", skip=2, nrows=2) 

## X2 X2.1 X0.406697876984254 
## 1 3 3   0.6199803 
## 2 4 4   0.0271722 


# selctive line retrieval function 
dummy <- function(file, ids){ 
    tmp <- 
    mapply(
     read.table, 
     skip=ids, 
     MoreArgs= list(nrows=1, file=file, sep=",") , 
     SIMPLIFY = FALSE 
    ) 
    tmp_df <- do.call(rbind.data.frame, tmp) 
    names(tmp_df) <- names(read.table("temp.csv", header=T, sep=",",nrows=1)) 
    return(tmp_df) 
} 

# et voila 
dummy("temp.csv", ids) 

## X myid  var 
## 1 1 1 0.9040861 
## 2 3 3 0.6027502 
## 3 4 4 0.6829611