wake-up-neo.com

Zeile zum Datenrahmen hinzufügen

Wie fügen Sie in R einem Datenrahmen eine neue Zeile hinzu, nachdem der Datenrahmen bereits initialisiert wurde?

Bisher habe ich folgendes:

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")
#I am trying to add hola and ciao as a new row
de<-data.frame("hola","ciao")
merge(df,de) #adds to the same row as new columns
#I couldnt find an rbind solution that wouldnt give me an error

Irgendwelche Ideen?

75
Rilcon42

Wie @Khashaa und @Richard Scriven in Kommentaren darauf hinweisen, müssen Sie für alle anzuhängenden Datenrahmen konsistente Spaltennamen festlegen. 

Daher müssen Sie die Spaltennamen für den zweiten Datenrahmen de explizit deklarieren und dann rbind() verwenden. Sie legen nur Spaltennamen für den ersten Datenrahmen fest, df:

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")

de<-data.frame("hola","ciao")
names(de)<-c("hello","goodbye")

newdf <- rbind(df, de)
75
Parfait

Lass es uns einfach machen:

df[nrow(df) + 1,] = list("v1","v2")

basierend auf Kommentaren bearbeitet. list anstelle von c verhindert Klassenänderungen beim Hinzufügen von gemischten Klassenzeilen.

52
Matheus Araujo

Oder, wie von @MatheusAraujo inspiriert:

df[nrow(df) + 1,] = list("v1","v2")

Dies würde gemischte Datentypen ermöglichen.

25
Ytsen de Boer

Ich mag list anstelle von c, da gemischte Datentypen besser verarbeitet werden. Hinzufügen einer zusätzlichen Spalte zur Frage des ursprünglichen Posters:

#Create an empty data frame
df <- data.frame(hello=character(), goodbye=character(), volume=double())
de <- list(hello="hi", goodbye="bye", volume=3.0)
df = rbind(df,de, stringsAsFactors=FALSE)
de <- list(hello="hola", goodbye="ciao", volume=13.1)
df = rbind(df,de, stringsAsFactors=FALSE)

Beachten Sie, dass einige zusätzliche Steuerelemente erforderlich sind, wenn die Umwandlung von Zeichenfolge/Faktor wichtig ist.

Oder verwenden Sie die Originalvariablen mit der Lösung von MatheusAraujo/Ytsen de Boer:

df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen", volume=20.2)

Beachten Sie, dass diese Lösung nicht gut mit den Zeichenfolgen funktioniert, es sei denn, Daten befinden sich im Datenrahmen.

9
gsk9

Nicht besonders elegant, aber:

data.frame(rbind(as.matrix(df), as.matrix(de)))

Aus der Dokumentation der Funktion rbind:

Für rbind werden Spaltennamen aus dem ersten Argument mit entsprechenden Namen übernommen: Colnames für eine Matrix ...

8
J. Win.

Es gibt jetzt add_row() aus den Paketen tibble oder tidyverse.

library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")

Nicht angegebene Spalten erhalten eine NA.

3
Joe

Ich muss beim Erstellen des Datenrahmens stringsAsFactors=FALSE hinzufügen.

> df <- data.frame("hello"= character(0), "goodbye"=character(0))
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = "hi") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "bye") :
  invalid factor level, NA generated
> df
  hello goodbye
1  <NA>    <NA>
> 

.

> df <- data.frame("hello"= character(0), "goodbye"=character(0), stringsAsFactors=FALSE)
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
> df[nrow(df) + 1,] = list("hola","ciao")
> df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen")
> df
  hello         goodbye
1    hi             bye
2  hola            ciao
3 hallo auf wiedersehen
> 
1
nealei

Es gibt einen einfacheren Weg, einen Datensatz von einem Datenrahmen an einen anderen anzuhängen, wenn Sie wissen, dass die beiden Datenrahmen die gleichen Spalten und Typen verwenden. Um eine Zeile von xx an yy anzuhängen, führen Sie einfach die folgenden Schritte aus, wobei i die i-te Zeile in xx ist.

yy[nrow(yy)+1,] <- xx[i,]

So einfach ist das. Keine unordentlichen Bindungen. Wenn Sie xx an yy anhängen müssen, rufen Sie entweder eine Schleife auf oder nutzen Sie die Sequenzfähigkeiten von R und führen Sie folgende Schritte aus:

zz[(nrow(zz)+1):(nrow(zz)+nrow(yy)),] <- yy[1:nrow(yy),]
0

Stellen Sie sicher, dass Sie beim Erstellen des Datenrahmens stringsAsFactors=FALSE angeben:

> rm(list=ls())
> trigonometry <- data.frame(character(0), numeric(0), stringsAsFactors=FALSE)
> colnames(trigonometry) <- c("theta", "sin.theta")
> trigonometry
[1] theta     sin.theta
<0 rows> (or 0-length row.names)
> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
> trigonometry[nrow(trigonometry) + 1, ] <- c("pi/2", sin(pi/2))
> trigonometry
  theta sin.theta
1     0         0
2  pi/2         1
> typeof(trigonometry)
[1] "list"
> class(trigonometry)
[1] "data.frame"

Wenn stringsAsFactors=FALSE beim Erstellen des Datenrahmens nicht verwendet wird, führt __.. Beim Versuch, die neue Zeile hinzuzufügen, zu folgender Fehlermeldung:

> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "0") :
  invalid factor level, NA generated
0
OracleJavaNet