2013-01-16 7 views
6

Sto lavorando a un tutorial R e sospetto che devo utilizzare una di queste funzioni, ma non sono sicuro di quale (Sì, le ho ricercate ma fino a diventare più fluente nella terminologia R sono abbastanza confusi).Conteggio del numero di righe di una serie di file CSV

Nella mia directory di lavoro è presente una cartella "specdata". Specdata contiene centinaia di file CSV denominati 001.csv - 300.csv.

La funzione su cui sto lavorando deve contare il numero totale di righe per un numero inserito di file csv. Quindi, se l'argomento della funzione è 1:10 e ciascuno di questi file ha dieci file, tornare 100.

Ecco quello che ho finora:

complete <- function(directory,id = 1:332) { 
    setpath <- paste("/Users/gcameron/Desktop",directory,sep="/") 
    setwd(setpath) 
    csvfile <- sprintf("%03d.csv", id) 
    file <- read.csv(csvfile) 
    nrow(file) 
} 

Questo funziona quando l'argomento ID è un numero, dicono 17. Ma, se dire ingresso I 10:50 come argomento, ricevo un errore:

Error in file(file, "rt") : invalid 'description' argument 

Cosa devo fare per essere in grado di contare il numero totale di righe dal parametro ID inputed?

risposta

9

read.csv si aspetta di leggere un solo file, quindi è necessario loop su file, un modo idiomatico R di farlo è quello di utilizzare sapply:

nrows <- sapply(csvfile, function(f) nrow(read.csv(f))) 
sum(nrows) 

Per esempio, qui è una riscrittura della funzione complete :

complete <- function(directory,id = 1:332) { 
    csvfiles <- sprintf("/Users/gcameron/Desktop/%s/%03d.csv", directory, id) 
    nrows <- sapply(csvfiles, function(f) nrow(read.csv(f))) 
    sum(nrows) 
} 
+0

Grazie. Quindi pochi follow up di Q se ne hai un secondo. 1) Dove inserisco questa linea? All'interno della funzione "completa" o dopo di essa? 2) Se dopo, non devo dichiarare nuovamente l'oggetto csvfile per l'ambito? 3) Il tuo parametro "function (f)" - è solo il nome della funzione che ho creato al suo posto? es. nrows <- sapply (csvfile, complete (f # cosa va qui?) nrow (read.csv (f) Come puoi senza dubbio dire che sto lottando un po 'con questo –

+0

ho modificato la mia risposta. la tua funzione originale non resetta mai la directory di lavoro quando è terminata, è sbagliato. –

+0

Grazie mille sono davvero grato per questo .Questo ha funzionato. Ora ho visto che posso dare un senso ad esso. –

1

I problemi di compiti a casa vengono solitamente etichettati come tali, anche se non so se è necessario, ma questo è chiaramente compito a casa.

La vostra funzione come scritta si aspetta che l'id sia non un vettore (a fronte del valore predefinito che è un vettore di numeri interi).

Cambiarlo per utilizzare una delle funzioni * apply (più concisa e comune) o anche un ciclo esplicito. Per ogni elemento nel vettore id, è necessario chiamare una funzione che apre quel file e conta le osservazioni.

This stackoverflow post ha una buona spiegazione delle differenze tra le funzioni * apply.

+3

[Il tag dei compiti è deprecato] (http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially -deprecato) – plannapus

+0

ok, grazie, ho cercato di vedere se era coperto nelle faq, ma non l'ho visto.Continuo a pensare che sia utile sapere quando è compito, dato che sono disposto a fornire una risposta completa per qualcuno che cerca di finire qualcosa al lavoro, ma preferirei dare consigli e indicazioni per i compiti. –

+0

Questo è davvero un buon punto, e ho pensato anche che avrebbero aggiunto quello alle faq poiché la maggior parte degli utenti non legge il blog o la metaSE. – plannapus

Problemi correlati