2013-06-25 14 views
11

Gibt es in R eine Funktion wie read.csv, die Dateien einliest, in denen die Header links (oder rechts) im Gegensatz zu den oberen befinden und die Daten von links nach rechts organisiert sind?CSV-Datei horizontal sortiert lesen

So würden die Daten wie folgt aussehen:

var1,1,2,3,4,5 

bei der Dokumentation der Suche nach read.table und read.csv, nichts zu Pop-out scheint. Die beste Option, die ich bei der Verwendung dieser Funktionen sehe, besteht darin, read.table zu verwenden und dann eine andere Tabelle zu erstellen, deren Spalten die Zeilen der Originaldaten usw. sind.

+0

Können Sie eine minimale 2 oder 3 Linie Beispiel dafür, wie Ihre Textdaten sieht aus? Meinst du, jede Zeile ist wie: 'var1,1,2,3,4,5'? – thelatemail

+0

Ja, genau so. Also ist der Header in diesem Fall die linke Spalte. –

+1

* Wenn * alle Variablen numerisch sind, dann können Sie tun, was Sie vorgeschlagen haben; 'x <- read.csv (...); y <- setNames (as.data.frame (t (x [, - 1])), as.character (x [, 1])) ' –

Antwort

14

Lassen Sie uns sagen, dass Ihre Datei ‚data.csv‘ genannt wird und es enthält:

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 

Hinweis var1 und var3 haben 6 Werte aber var2 hat nur 5. So ist die Idee, die Daten zu lesen ist, transponieren Sie es und verwenden Sie dann read.csv. Dann

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) 

} 

, können Sie tun:

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