Подтвердить что ты не робот

Добавить строку в 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

Любые идеи?

4b9b3361

Ответ 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.