2014-10-31 18 views
9

Ich habe umfangreich gesucht, aber keine Antwort auf diese Frage zu Stack Overflow gefunden.Hinzufügen von Spalten zu einem leeren Datenrahmen in R

Lets sagen, ich habe einen Datenrahmen a.

Ich definiere:

a <- NULL 
a <- as.data.frame(a) 

Wenn ich als so eine Spalte dieses Datenrahmen hinzufügen wollte:

a$col1 <- c(1,2,3) 

ich die folgende Fehlermeldung erhalten:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0 

Warum ist die Zeilendimension ist fixiert, aber die Spalte nicht?

Wie ändere ich die Anzahl der Zeilen in einem Datenrahmen?

Wenn ich dies tun (die Daten in eine Liste eingegeben und dann zu einem df Umwandlung), es funktioniert gut:

a <- NULL 
a$col1 <- c(1,2,3) 
a <- as.data.frame(a) 

Antwort

7

Die Zeilendimension ist nicht festgelegt, sondern data.frames werden als Liste gespeichert von Vektoren, die auf die gleiche Länge beschränkt sind. Sie können col1 nicht zu a hinzufügen, da col1 drei Werte (Zeilen) hat und a Null hat, wodurch die Einschränkung aufgehoben wird. R aktiviert Werte nicht automatisch, wenn Sie versuchen, die Dimension eines data.frames zu erweitern, indem Sie eine Spalte hinzufügen, die länger als data.frame ist. Der Grund dafür, dass das zweite Beispiel funktioniert, ist, dass col1 der einzige Vektor im data.frame ist, so dass data.frame mit drei Zeilen initialisiert wird.

Wenn Sie automatisch möchten die data.frame haben zu erweitern, können Sie die folgende Funktion verwenden:

cbind.all <- function (...) 
{ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
     nrow(x), ncol(x))))) 
} 

Diese fehlende Werte mit NA füllen. Und Sie würden es wie: cbind.all(df, a)

+0

Ich denke, diese Nähe zu dem, was ich bereits getan. Ich dachte, es gäbe eine klügere Lösung als diese. Mir ist klar, dass ich einen Vektor verwende, anstatt ihn einem Datenrahmen hinzuzufügen. Außerdem habe ich wahrscheinlich nicht beschrieben, was ich gut meinte, als ich das Wort fixed benutzte. Die Zeilendimension kann nicht einfach wie die Spaltendimension geändert werden. – Michal

+0

Es ist auch die gleiche Antwort wie folgt: http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal

1

Sie könnten auch etwas tun, wo ich Daten aus mehreren Dateien einlesen, die Spalte, die ich will, greifen, und speichern Sie es im Dataframe. Ich überprüfe, ob die Datenrahmen etwas in ihm, und wenn dies nicht der Fall, erstellen Sie eine neue und nicht immer den Fehler über nicht übereinstimmen Anzahl der Zeilen:

readCounts = data.frame() 

for(f in names(files)){ 
    d = read.table(files[f], header=T, as.is=T) 
    d2 = round(data.frame(d$NumReads)) 
    colnames(d2) = f 
    if(ncol(readCounts) == 0){ 
     readCounts = d2 
     rownames(readCounts) = d$Name 
    } else{ 
     readCounts = cbind(readCounts, d2) 
    } 
} 
Verwandte Themen