IT

데이터 프레임에 행 추가

lottoking 2020. 8. 29. 13:24
반응형

데이터 프레임에 행 추가


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

어떤 아이디어?


@Khashaa 및 @Richard Scriven이 주석에서 지적한 것처럼 추가하려는 모든 데이터 프레임에 대해 일관된 열 이름을 설정해야합니다.

두-th 데이터 따라서-frame의 열 이름을 명시 적으로 선언 한 다음를 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)

간단하게 만들어 보겠습니다.

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

또는 @MatheusAraujo에서 영감을 얻었습니다.

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

이것은 혼합 데이터 유형을 허용합니다.


내가 좋아하는 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)

이 솔루션은 데이터 프레임에 기존 데이터가없는 한에서 작동하지 않습니다.


별로 우아하지 않지만 :

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

rbind함수 문서에서 :

대규모 rbind열 이름 적당한 가격이 인수되었습니다.


지금 거기 add_row()에서 tibble또는 tidyverse패키지.

library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")

지정되지 않은 열은 NA.


stringsAsFactors=FALSE데이터 프레임을 만들 때 추가해야합니다 .

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

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

두 데이터 프레임이 동일한 열과 유형을 공유한다는 것을 알고있는 경우 한 데이터 프레임의 레코드를 다른 데이터 프레임에 추가하는 더 간단한 방법이 있습니다. 에서 하나 개의 행을 추가하려면 xxyy바로 다음을 수행 i는 IS i에서 '번째 행을 xx.

yy[nrow(yy)+1,] <- xx[i,]

그렇게 간단합니다. 지저분한 바인딩이 없습니다. 당신이 모두 추가해야하는 경우 xx에를 yy, 다음 중 하나 루프를 전화 또는 R의 순서 능력을 활용하고이 작업을 수행 :

zz[(nrow(zz)+1):(nrow(zz)+nrow(yy)),] <- yy[1:nrow(yy),]

참고 URL : https://stackoverflow.com/questions/28467068/add-row-to-dataframe

반응형