2015-02-12 30 views
32

W R, w jaki sposób dodać nowy wiersz do ramek danych po już zainicjalizowanej ramce danych?Dodaj wiersz do ramki danych

Do tej pory mam to:

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 

Jakieś pomysły?

+1

również przypisz nazwy do 'de'. 'names (de) <- c (" hello "," goodbye ")' i 'rbind' – Khashaa

+2

Lub w jednym wierszu' rbind (df, setNames (de, names (df))) ' –

+0

To naprawdę jest obszar, który Podstawa R kończy się nieszczęśliwie i ma długi czas: http://stackoverflow.com/questions/13599197/rbind-data-frames-without-names – thelatemail

Odpowiedz

34

Podobnie jak @Khashaa i @Richard Scriven wskazują na komentarze, musisz ustawić spójną kolumnę nazwy dla wszystkich ramek danych, które chcesz dołączyć.

W związku z tym należy jawnie zadeklarować nazwy kolumn dla drugiej ramki danych, de, a następnie użyć rbind(). Ustawić tylko nazwy kolumn dla pierwszej ramki danych, 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) 
+0

Dzięki! Każdy pomysł, jak to naprawić, jeśli nie mam zadeklarowanej drugiej ramki danych, ale zamiast tego mam każdą wartość, którą chcę dodać do nowego wiersza przechowywanego jako zmienna? – Rilcon42

+3

Spróbuj: 'newdf <-rbind (df, data.frame (hello =" hola ", do widzenia =" ciao "))' OR ze zmienną: 'newdf <-rbind (df, data.frame (witaj = var1, do widzenia) = var2)) ' – Parfait

5

Nie strasznie elegancki, ale:

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

Z dokumentacji funkcji rbind:

Dla rbind nazwy kolumn są pobierane z pierwszego argumentu z odpowiednimi nazwami: colnames na matrycy ..

+0

To rozwiązanie działa bez konieczności określania kolumn do dodania, co jest znacznie lepsze dla aplikacji na dużych zestawach danych –

19

Zróbmy to proste:

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

Powoduje to problemy podczas próby dodania nowego wiersza z mieszanymi typami danych (niektóre ciągi, niektóre numeryczne). W takim przypadku nawet wartości liczbowe są konwertowane na ciąg znaków. Jednym rozwiązaniem jest dodanie wartości osobno, podobnie jak poniżej (zakładając, że istnieją 3 kolumny): 'df [nrow (df) + 1, 1: 2] = c (" v1 "," v2 ")' i 'df [nrow (df), 3] = 100' Ale nadal dobrym pomysłem jest dodanie nowego wiersza. Tak więc, +1 –

+4

Lub użyj "listy" zamiast "c". –

9

Albo, jak inspirowana @MatheusAraujo:

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

ten pozwoliłoby na mieszane typy danych.

3

I like list zamiast c, ponieważ lepiej obsługuje typy danych mieszanych. Dodanie dodatkowej kolumny do pytania oryginalnego plakatu:

#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) 

Należy pamiętać, że wymagana jest dodatkowa kontrola, jeśli konwersja ciągu znaków/czynnika jest ważna.

lub używając oryginalnych zmiennych z roztworu z MatheusAraujo/Ytsen de Boer:

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

Należy zauważyć, że rozwiązanie to nie działa dobrze z ciągów chyba że istniejące dane w dataframe.

Powiązane problemy