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?
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)
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.
Oder, wie von @MatheusAraujo inspiriert:
df[nrow(df) + 1,] = list("v1","v2")
Dies würde gemischte Datentypen ermöglichen.
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.
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 ...
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
.
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
>
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),]
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