2013-06-25 13 views
11

In R, esiste una funzione come read.csv che legge nei file in cui le intestazioni si trovano a sinistra (o a destra) rispetto alla parte superiore ei dati sono organizzati da sinistra a destra?Lettura di un file CSV organizzato orizzontalmente

Quindi i dati sarebbe simile:

var1,1,2,3,4,5 

Guardando la documentazione per read.table e read.csv, nulla sembra saltar fuori. L'opzione migliore che vedo usando queste funzioni è usare read.table e quindi costruire un'altra tabella le cui colonne sono le righe dei dati originali e così via.

+0

può dare un minimo esempio 2 o 3 la linea di come la vostra sembra un dato di testo? Intendi dire che ogni riga è simile a: 'var1,1,2,3,4,5'? – thelatemail

+0

Sì, esattamente così. Quindi l'intestazione in questo caso è la colonna più a sinistra. –

+1

* se * tutte le variabili sono numeriche allora puoi fare come hai suggerito; 'x <- read.csv (...); y <- setNames (as.data.frame (t (x [, - 1])), as.character (x [, 1])) ' –

risposta

14

Diciamo che il file si chiama 'data.csv' e contiene:

var1,1,2,3,4,5,6 
var2,2.1,3.9,4.6,5.2,6.1 
var3,M,F,M,F,M,M 

Nota var1 e var3 hanno 6 valori, ma var2 ha solo 5. Così, l'idea è quella di leggere i dati, trasporre e quindi utilizzare read.csv.

read.tcsv = function(file, header=TRUE, sep=",", ...) { 

    n = max(count.fields(file, sep=sep), na.rm=TRUE) 
    x = readLines(file) 

    .splitvar = function(x, sep, n) { 
    var = unlist(strsplit(x, split=sep)) 
    length(var) = n 
    return(var) 
    } 

    x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n)) 
    x = apply(x, 1, paste, collapse=sep) 
    out = read.csv(text=x, sep=sep, header=header, ...) 
    return(out) 

} 

Poi, si può fare:

read.tcsv ("data.csv")

var1 var2 var3 
1 1 2.1 M 
2 2 3.9 F 
3 3 4.6 M 
4 4 5.2 F 
5 5 6.1 M 
6 6 NA M