Добавить строку в dataframe
В R, как вы добавляете новую строку в фреймворк данных после того, как датафрейм уже инициализирован?
Пока у меня есть это:
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
Как @Khashaa и @Richard Scriven указывают в комментариях, вы должны установить согласованные имена столбцов для всех фреймов данных, которые вы хотите добавить.
Следовательно, вам нужно явно объявить имена колонок для второго фрейма данных 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)
Ответ 2
Пусть это упростит:
df[nrow(df) + 1,] = list("v1","v2")
отредактированный на основе комментариев. list
вместо c
предотвращает изменения классов в случае добавления строк смешанного класса.
Ответ 3
Или, как вдохновлено @MatheusAraujo:
df[nrow(df) + 1,] = list("v1","v2")
Это позволит использовать смешанные типы данных.
Ответ 4
Мне нравится list
вместо 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 de Boer:
df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen", volume=20.2)
Обратите внимание, что это решение не очень хорошо работает с строками, если в DataFrame нет данных.
Ответ 5
Не очень элегантный, но:
data.frame(rbind(as.matrix(df), as.matrix(de)))
Из документации функции rbind
:
Для rbind
имена столбцов берутся из первого аргумента с соответствующими именами: colnames для матрицы...
Ответ 6
Мне нужно добавить stringsAsFactors=FALSE
при создании dataframe.
> 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
>
Ответ 7
Существует более простой способ добавления записи из одного блока данных в другой, если вы знаете, что два фрейма данных имеют одни и те же столбцы и типы. Чтобы добавить одну строку из xx
в yy
выполните следующие действия, где i
- i
-я строка в xx
.
yy[nrow(yy)+1,] <- xx[i,]
Просто как тот. Никаких беспорядочных связей. Если вам нужно добавить все xx
в yy
, то либо вызовите цикл, либо воспользуйтесь способностями R-последовательности и выполните следующее:
zz[(nrow(zz)+1):(nrow(zz)+nrow(yy)),] <- yy[1:nrow(yy),]
Ответ 8
Не stringsAsFactors=FALSE
указать stringsAsFactors=FALSE
при создании фрейма данных:
> 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"
Неспособность использовать stringsAsFactors=FALSE
при создании фрейма данных приведет к следующей ошибке при попытке добавить новую строку:
> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
Warning message:
In '[<-.factor'('*tmp*', iseq, value = "0") :
invalid factor level, NA generated
Ответ 9
Там теперь add_row()
из пакетов tibble
или tidyverse
.
library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")
Неуказанные столбцы получают NA
.