programing

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

css3 2023. 7. 4. 22:02

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

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

어떤 도움이라도 주시면 감사하겠습니다.

간단히 설명해 보겠습니다.

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

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

따라서 두 번째 데이터 프레임의 열 이름을 명시적으로 선언해야 합니다.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)

지금은 없습니다.add_row()에서tibble또는tidyverse꾸러미

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

지정되지 않은 열은 다음 값을 가져옵니다.NA.

또는 @Matheus Araujo에서 영감을 받은 것처럼:

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)

문자열/인자 변환이 중요한 경우에는 추가적인 제어가 필요합니다.

또는 Matheus Araujo/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열 이름은 첫 번째 인수에서 적절한 이름으로 가져옵니다. 행렬의 열 이름...

빈 데이터 프레임을 만들고 루프에 내용을 추가하려는 경우 다음과 같은 작업이 도움이 될 수 있습니다.

# 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

도움이 되길 바랍니다 :)

루프에서 data.frame을 작성하는 방법

df <- data.frame()
for(i in 1:10){
  df <- rbind(df, data.frame(str="hello", x=i, y=i*10))
}

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

추가해야 합니다.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

dplyr > = 1.0.0에서 다음을 사용할 수 있습니다.

df1 <- data.frame(hello = "hi", goodbye = "bye")
df2 <- data.frame(hello = "hola", goodbye = "ciao")

library(dplyr)

df1 %>% 
  rows_insert(df2)
Matching, by = "hello"
  hello goodbye
1    hi     bye
2  hola    ciao

참고: 의 모든 열df2존재해야 함df1그러나 모든 열은 그렇지 않습니다.df1에 있어야 합니다.df2.

행동을 는 다른 행동들이 .row_*옵션들.예를 들어, 다음을 사용할 수 있습니다.row_upsert값이 이미 있는 경우 값을 덮어씁니다. 그렇지 않으면 값을 삽입합니다.

df2 <- data.frame(hello = c("hi", "hola"), goodbye = c("goodbye", "ciao"))

library(dplyr)

df1 %>% 
  rows_upsert(df2)
Matching, by = "hello"
  hello goodbye
1    hi goodbye # bye updated to goodbye since "hi" was already in data frame
2  hola    ciao # inserted because "hola" was not in the data frame

이러한 함수는 키 열을 일치시켜 작동합니다.에 약에만.by되지 않은 은 두 의 첫 입니다.df2에서는) 첫 프레임으)로 합니다.df1이 예에서는).

다른 사용자가 setNames를 사용한 작업을 공식화하려면:

add_row <- function(original_data, new_vals_list){ 
  # appends row to dataset while assuming new vals are ordered and classed appropriately. 
  # new_vals must be a list not a single vector. 
  rbind(
    original_data,
    setNames(data.frame(new_vals_list), colnames(original_data))
    )
  }

합법적인 경우 클래스를 유지하고 오류를 다른 곳으로 전달합니다.

m <- mtcars[ ,1:3]
m$cyl <- as.factor(m$cyl)
str(m)

#'data.frame':  32 obs. of  3 variables:
# $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
# $ disp: num  160 160 108 258 360 ...

숫자로 전달되었지만 4를 추가할 때 유지되는 요인입니다.

str(add_row(m, list(20,4,160)))
#'data.frame':  33 obs. of  3 variables:
# $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ... 
# $ disp: num  160 160 108 258 360 ...

4,6,8이 아닌 값을 통과하려고 하면 요인 수준이 유효하지 않다는 오류가 반환됩니다.

str(add_row(m, list(20,3,160)))
# 'data.frame': 33 obs. of  3 variables:
# $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
# $ disp: num  160 160 108 258 360 ...
Warning message:
In `[<-.factor`(`*tmp*`, ri, value = 3) :
  invalid factor level, NA generated

제가 다른 제안들을 추가하겠습니다.기본 코드를 사용하여 데이터 프레임을 만듭니다.

data_set_name <- data.frame(data_set)

이제 돌아가서 무언가를 테스트해야 할 경우를 대비하여 원래 데이터 프레임을 복제하는 것이 좋습니다.아래에 나열했습니다.

data_set_name_copy <- data_set_name

새 열을 추가하려면 코드는 다음과 같습니다.

data_set_name_copy$Name_of_New_Column <- Data_for_New_Column

$새 열을 추가하고 있으며 개요에 따라 바로 새 항목의 이름/이름을 삽입합니다.

생각합니다,

rbind.data.frame(df, de)

방법을 강구해야 합니다.

이전 답변을 기반으로 대체 기능을 사용하여 데이터 프레임에 새 행을 추가할 수 있습니다.대체 함수는 코드 복잡성을 캡슐화할 수 있으며, 이는 동일한 코드에서 행 추가가 여러 번 발생할 때 유용합니다.

이러한 함수의 여러 버전은 복잡성이 증가하는 순서대로 표시됩니다.

버전 1: 이 버전은 @Matheus Araujo 또는 @Ytsende Boer의 답변과 같습니다.새 행에 대한 모든 열 데이터가 고정된 순서로 존재하는 경우 이 값은 작고 유용합니다.

'new_row<-'<- function(x, value){x[nrow(x) + 1,] <- value; x}

 df <- data.frame(A = 1,  B = 2,  C = 3)
 new_row(df) <- c(4,  5,  6)
 new_row(df) <- list(7,  8,  9)

버전 2: 이 버전은 약간 더 길지만 새 데이터를 열 이름으로 키를 지정하여 추적성을 향상시킵니다.새 행을 추가할 때는 명명된 모든 열이 반드시 순서대로 있어야 합니다.

'new_row<-'<- function(x, value){
    x[nrow(x) + 1,] <- sapply(names(x), function(y){value[y]}); x
 }

 df <- data.frame(A = 1,  B = 2,  C = 3)
 new_row(df) <- c(B = 1, C = 2,  A = 3)     
 new_row(df) <- list(C = 1,  A = 2,  B = 3)
 new_row(df) <- data.frame(A = 3,  B = 4,  C = 5)
 

버전 3: 열이 없을 때와 명명된 새 열이 포함될 때 이 벌크선 버전이 작동합니다.이는 열 데이터가 불완전한 상태에서 새 행을 추가해야 하거나 새 행이 데이터 프레임에 부분적으로만 적합한 경우에 유용합니다.

'new_row<-'<- function(x, value){
  x[names(value)[!is.element(names(value), names(x))]] <- numeric()
  x[nrow(x) + 1,] <- sapply(names(x), function(y){
    if(is.element(y,names(value))){return(value[y])}else{return(NA)}
  }); x}  

df <- data.frame(A = 1,  B = 2,  C = 3)

new_row(df) <- NA
new_row(df) <- c(A = 5)
new_row(df) <- list(C = 1,  A = 2, B = 1)
new_row(df) <- data.frame(Z = 1000)

언급URL : https://stackoverflow.com/questions/28467068/how-to-add-a-row-to-a-data-frame-in-r