R의 데이터 프레임에 행을 추가하는 방법은 무엇입니까?


129

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

# Unfortunately, I couldn't find an rbind() solution that wouldn't give me an error

어떤 도움을 주시면 감사하겠습니다


1
이름 de도 할당하십시오 . names(de) <- c("hello","goodbye")그리고rbind
Khashaa

3
또는 한 줄로rbind(df, setNames(de, names(df)))
Rich Scriven

2
이것은 실제로 base R이 비참하게 실패하고 오랫동안 가지고있는 영역입니다. stackoverflow.com/questions/13599197/…
thelatemail

1
@thelatemail이 동의하지 않습니다. 데이터 프레임은 r의 특수 구조입니다. 공통 dimname, 속성 및 메소드가있는 목록 목록입니다. rbind(data.frame(a = 1), data.frame(b = 2)).. 할 수없는 일이 몹시 기대되는 것 같아요 . 왜 하시겠어요? 상관없이 오류가 발생하기를 바랍니다. 그것은 merge무작위 by변수로 'ing' 과 같습니다 . 그리고 이것은 2015 년입니다. 모두가 설정되지 options(stringsAsFactors = FALSE)않습니까?
rawr

1
@rawr-물론, 다른 이름을 묶어서는 안되지만, R은 이름이없는 이름에 바인딩하거나, 이름을 같은 차원의 이름에 바인딩하지 않거나, 새로운 요인 수준을 통합하기 위해 새 데이터를 바인딩하는 것을 처리 할 수 ​​없습니다. 약점이라고 생각합니다. 특히 바인딩 반복 이름과 모든 NA 이름을 처리 할 수있는 경우. 설정 stringsAsFactors=FALSE은 빠른 수정이 될 수 있지만 다른 사람들이 다르게 설정하게 될 기본값을 변경하면 하루를 정말 망칠 수 있습니다.
thelatemail

답변:


131

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

감사! 두 번째 데이터 프레임을 선언하지 않고 대신 변수로 저장된 새 행에 추가하려는 각 값이있는 경우이 문제를 해결하는 방법이 있습니까?
Rilcon42

8
시도 : newdf<-rbind(df, data.frame(hello="hola", goodbye="ciao"))OR 변수 :newdf<-rbind(df, data.frame(hello=var1, goodbye=var2))
Parfait

109

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

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

10
이로 인해 혼합 된 데이터 유형 (일부 문자열, 일부 숫자)이있는 새 행을 추가하려고 할 때 문제가 발생합니다. 이 경우 숫자 값도 문자열로 변환됩니다. 한 가지 해결 방법은 (3 열이있는 가정) 다음과 같은 별도 뭔가를 값을 추가하는 것입니다 df[nrow(df) + 1, 1:2] = c("v1", "v2")df[nrow(df), 3] = 100하지만 여전히 그것은 새 행을 추가하는 방법에 대한 좋은 점이다. 그래서, 한
학생 영혼

17
또는 "c"대신 "list"를 사용하십시오.
Ytsen de Boer

좋은 생각이지만 첫 번째 위치에 새 행을 삽입하거나 추가하려면 어떻게해야합니까?
Darwin PC

1
data.table로 이것을 시도했지만 nrow + 1이 범위를 벗어났다고 알려줍니다.
Herman Toothrot

1
@Arani에 이미 답변이 list()있습니다. 수정 사항을 되돌 렸습니다.
M--

41

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

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

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


24

지금 거기 add_row()로부터 tibble또는 tidyverse패키지.

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

지정되지 않은 열은 NA.


깔끔한 철학을 고수한다면이 접근 방식을 좋아했습니다. 그렇지 않으면 기본 R 구문은 패키지를 가져올 권한이없는 환경에있을 때 유용한 생존 기술입니다. 나는 특히와 일반 R 구문을 사용하여 대답 같은 rbindas.matrix 아래
파블로 Adames

17

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

이 솔루션은 데이터 프레임에 기존 데이터가 없으면 문자열과 잘 작동하지 않습니다.


에서 hellogoodbye문자가있는 경우 df다음을 수행 할 수 있습니다. 목록에서 반드시 이름을 사용하는 것은 아닙니다. df <- data.frame(hello = "hi", goodbye = "bye", volume = 1,stringsAsFactors = FALSE); rbind(df, list("hola", "ciao", 100)).
jazzurro

11

별로 우아하지는 않지만 :

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

rbind함수 문서에서 :

들면 rbind열 이름 적절한 이름 첫번째 인수 찍은 같습니다 행렬 COLNAMES ...


이 솔루션은 추가 할 열을 지정할 필요없이 작동합니다. 이는 대규모 데이터 세트의 애플리케이션에 훨씬 더 좋습니다
Phil_T

1

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
> 

1

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

0

두 데이터 프레임이 동일한 열과 유형을 공유한다는 것을 알고있는 경우 한 데이터 프레임의 레코드를 다른 데이터 프레임에 추가하는 더 간단한 방법이 있습니다. 에서 하나 개의 행을 추가하려면 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),]

0

빈 데이터 프레임을 만들고 루프에 내용을 추가하려면 다음이 도움이 될 수 있습니다.

# Number of students in class
student.count <- 36

# Gather data about the students
student.age <- sample(14:17, size = student.count, replace = TRUE)
student.gender <- sample(c('male', 'female'), size = student.count, replace = TRUE)
student.marks <- sample(46:97, size = student.count, replace = TRUE)

# Create empty data frame
student.data <- data.frame()

# Populate the data frame using a for loop
for (i in 1 : student.count) {
    # Get the row data
    age <- student.age[i]
    gender <- student.gender[i]
    marks <- student.marks[i]

    # Populate the row
    new.row <- data.frame(age = age, gender = gender, marks = marks)

    # Add the row
    student.data <- rbind(student.data, new.row)
}

# Print the data frame
student.data

도움이되기를 바랍니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.