2015-02-12 4 views
32

В R, как вы добавляете новую строку в dataframe после того, как датафрейм уже инициализирован?Добавить строку в dataframe

До сих пор у меня есть это:

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 

Любые идеи?

+1

присваивать имена 'de' тоже. 'names (de) <- c (" hello "," goodbye ")' и 'rbind' – Khashaa

+2

Или в одной строке' rbind (df, setNames (de, names (df))) –

+0

Это действительно область, которая база R терпит неудачу и долгое время: http://stackoverflow.com/questions/13599197/rbind-data-frames-without-names – thelatemail

ответ

34

Как @ Хаша и @ Рихард Скривен указывают в комментариях, вы должны установить согласованную колонку имена для всех фреймов данных, которые вы хотите добавить.

Следовательно, вам необходимо явно объявить имена столбцов для второго кадра данных, de, а затем использовать rbind(). Вы только установить имена столбцов для первого кадра данных, 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

Спасибо! Любая идея, как исправить это, если у меня нет второго объявленного фрейма, но вместо этого есть каждое значение, которое я хочу добавить в новую строку, сохраненную как переменную? – Rilcon42

+3

Попробуйте: 'newdf <-rbind (df, data.frame (hello =" hola ", goodbye =" ciao "))' ИЛИ с переменной: 'newdf <-rbind (df, data.frame (hello = var1, goodbye) = var2)) ' – Parfait

5

Не очень элегантно, но:

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

Из документации функции rbind:

Для rbind имен столбцов берутся из первого аргумента с соответствующими названиями: COLNAMES для матрицы .. .

+0

Это решение работает без необходимости указывать столбцы для добавления, что намного лучше для приложений на больших наборах данных. –

19

Давайте сделаем это просто:

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

Это вызывает проблемы при попытке добавить новую строку со смешанными типами данных (некоторые строки, некоторые числовые). В этом случае даже числовые значения преобразуются в строку. Одним из способов является добавление значений отдельно, что-то вроде следующего (предполагается, что существует 3 столбца): 'df [nrow (df) + 1, 1: 2] = c (" v1 "," v2 ")' и 'df [nrow (df), 3] = 100' Но все же это хорошая идея добавить новую строку. Итак, +1 –

+4

Или используйте «список» вместо «c». –

9

Или, как вдохновленный @MatheusAraujo:

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

Это позволят использовать смешанные типы данных.

3

Мне нравится список вместо c, потому что он лучше обрабатывает смешанные типы данных. Добавление дополнительного столбца к вопросу оригинального плаката:

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

Обратите внимание, что некоторый дополнительный контроль не требуется, если преобразование строки/фактор важно.

Или используя исходные переменные с раствором из MatheusAraujo/Ytsen де Бур:

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

Обратите внимание, что это решение не очень хорошо работает со строками, если нет существующих данных в dataframe.

Смежные вопросы