2016-06-25 18 views
3

Ich bin neu in R und fragte mich, ob jemand erklären könnte, warum, wenn eine Zeile zu einem leeren data.frame hinzugefügt wird, nachdem die Spalten benannt wurden, die Spaltennamen umbenannt werden. Dies tritt nicht auf, wenn dem data.frame eine Zeile hinzugefügt wurde, bevor die Spalten benannt werden, oder wenn eine leere Zeile bei der Definition von data.frame enthalten ist.Datenrahmen Spaltennamen für leere Daten.frame

Spaltennamen, bevor Zeile zusätzlich definiert (die neuen Spaltennamen beobachten, 'XaXb'):

df1 <- data.frame(character(), character(), stringsAsFactors = FALSE) 
colnames(df1) <- c("one", "two") 
df1 <- rbind(df1, c("a", "b")) 
df1 
# X.a. X.b. 
#1 a b 

Zeile hinzugefügt, bevor Spalte definiert:

df2 <- data.frame(character(), character(), stringsAsFactors = FALSE) 
df2 <- rbind(df2, c("a", "b")) 
colnames(df2) <- c("one", "two") 
df2 
# one two 
#1 a b 

Spaltennamen vor der Zeile hinaus in einem definierte Datenrahmen, der mit einer leeren Zeile definiert ist:

df3 <- data.frame(character(1), character(1), stringsAsFactors = FALSE) 
colnames(df3) <- c("one", "two") 
df3 <- rbind(df3, c("a", "b")) 
df3 
# one two 
#1   
#2 a b 
+0

Was ist der Anwendungsfall zum Erstellen eines namenlosen (aber nicht spaltenlosen) data.frame? Obwohl ich nicht behaupten kann, dass es ein wenig "aus" ist, kann ich mir nicht vorstellen, wann es ausgelöst werden würde. – r2evans

+0

Gut entdeckt. Ich benutzte den leeren data.frame mit Spalten und benutzte rbind, bevor ich erkannte, dass der Code, den ich in R umsetzte, mir freundlicher wäre, wenn ich einen Index benutzte. Jetzt benutze ich 'df [i,] <- c (" a "," b ")' und es gibt nichts Seltsames, was ich sehen kann. Wie ich in meiner Frage gesagt habe, bin ich neu bei R und dachte, dass ich es vermeiden könnte, diesem ungewöhnlichen Datensatz einen Index zuzuordnen. Es ist ungewöhnlich, weil es ** algorithmisch generiert **. Warum dies tabellarisch sein müsste, ist eine andere Frage! – MellifluousMelt

Antwort

1

In der Regel können data.frames nur verbunden werden y wenn sie die gleichen Spaltennamen haben.

data1 <- data.frame(x = 1, y = 1) 
data2 <- data.frame(x = 2, y = 2) 
rbind(data1, data2) 

Andernfalls werden Sie einen Fehler erhalten.

data1 <- data.frame(xa = 1, ya = 1) 
data2 <- data.frame(x = 2, y = 2) 
rbind(data1, data2) 
# Error in match.names(clabs, names(xi)) : names do not match previous names 

Wenn jedoch eine der data.frames leer ist, die nicht leer data.frame werden die Eigenschaften des neuen data.frame regieren.

data1 <- data.frame(x = numeric(), y = numeric()) 
data2 <- data.frame(xa = 2, ya = 2) 
rbind(data1, data2) 

data1 <- data.frame(xa = 2, ya = 2) 
data2 <- data.frame(x = numeric(), y = numeric()) 
rbind(data1, data2) 

In Ihrem Fall c ("a", "b") auf data.frame dazu gezwungen, bevor sie mit den anderen data.frame verbinden. Dann erstellt es einen automatischen Spaltennamen für den erzwungenen data.frame und es wird die Eigenschaften des neuen data.frame bestimmen, da es nicht leer ist.

+0

Ich musste das viele Male lesen, aber schließlich versteht mein Gehirn, was du schreibst. Um zusammenzufassen, was Sie sagen und zu überprüfen, habe ich das Recht, eine leere data.frame ist nicht vollständig instanziiert, auch wenn es Spaltennamen hat, es sei denn, es hat Daten (Werte), ja? – MellifluousMelt

+0

@MellifluousMelt Ich denke, Sie haben Recht, und das ist der Grund, warum Sie die beiden data.frames (eins leer und das andere nicht-leer) verbinden können, auch wenn ihre Spaltennamen nicht kompatibel sind. –

Verwandte Themen