wake-up-neo.com

Wie füge ich Zeilen zu leeren Datenrahmen mit Header in R hinzu?

Mögliches Duplikat:
R: Spaltennamen verlieren, wenn Zeilen zu einem leeren Datenrahmen hinzugefügt werden

Ich habe nur wie folgt einen leeren Datenrahmen mit Spaltennamen erstellt

> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData <- rbind(compData,c(5,443))
> compData
  X5 X443
1  5  443

oben werden nach dem Hinzufügen einer Zeile die Spaltennamen geändert. Wie kann ich dem Datenrahmen neue Zeilendaten hinzufügen?

35

Das Hinzufügen zu einer Null-Zeile data.frame Unterscheidet sich vom Hinzufügen zu einem data.frame, Das bereits Zeilen enthält

Von ?rbind

Bei der rbind-Datenrahmenmethode werden zuerst alle Argumente mit null Spalten und null Zeilen gelöscht. (Wenn dies nicht der Fall ist, wird das erste Argument mit Spalten zurückgegeben, andernfalls ein nullspaltiger Datenrahmen mit Nullzeilen.) Anschließend werden die Klassen der Spalten aus dem ersten Datenrahmen übernommen und die Spalten werden nach Namen (statt nach Position) abgeglichen. . Die Ebenen von Faktoren werden nach Bedarf erweitert (in der Reihenfolge der Ebenen der Ebenen der angetroffenen Faktoren), und das Ergebnis ist ein geordneter Faktor, wenn alle Komponenten geordnete Faktoren waren. (Der letzte Punkt unterscheidet sich von S-PLUS.) Kategorien alten Stils (ganzzahlige Vektoren mit Ebenen) werden zu Faktoren heraufgestuft.

Sie haben eine Reihe von Möglichkeiten -

am einfachsten

 compData[1, ] <- c(5, 443)

komplizierter

Oder Sie könnten c(5,433) zu einer Liste oder einem Datenrahmen zwingen

rbind(compData,setNames(as.list(c(5,443)), names(compData)))

oder

rbind(compData,do.call(data.frame,setNames(as.list(c(5,443)), names(compData))))

Aber in diesem Fall könnten Sie es genauso gut tun

do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))

option data.table

Sie können die data.table - Funktion rbindlist verwenden, die weniger prüft und daher die Namen des ersten data.frames beibehält

library(data.table)
rbindlist(list(compData, as.list(c(5,443))
28
mnel

Ich habe gerade eine einfachere Möglichkeit, es zu tun ... wie folgt

compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData
17
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
5
Maiasaura

Sie können den Datenrahmen nach Index zuweisen:

compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[1, ] <- c(5, 443)
compData

Welches gibt:

> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData[1, ] <- c(5, 443)
> compData
  A   B
1 5 443
3
Marius

Wenn Sie Daten des gleichen Typs * haben, können Sie Folgendes tun:

  1. Konvertiert den aktuellen Datenrahmen in eine Matrix.
    as.matrix(compData)
  2. Fügen Sie die neue Zeile am Ende hinzu.
    rbind(as.matrix(compData), c(5,443))
  3. Konvertieren Sie die Matrix zurück in einen Datenrahmen.
    as.data.frame(rbind(as.matrix(compData), c(5,443)))

Zusamenfassend:
compData <- as.data.frame(rbind(as.matrix(compData), c(5,443)))

* Wenn Sie Daten desselben Typs haben, möchten Sie diese möglicherweise in einer Matrix speichern.

2
srctaha

Sie können die Funktion structure mit dem .Names Streit:

compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))

#  A   B
#1 5 443
2
Sven Hohenstein