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
'programing' 카테고리의 다른 글
C의 배열에 여러 값 할당 (0) | 2023.07.04 |
---|---|
PL/SQL 프로그램 중단 (0) | 2023.07.04 |
JPA - DDL에서 문자열 열을 varchar(max)로 설정하는 방법 (0) | 2023.06.29 |
어떻게 하면 Git-diff처럼 일을 어렵게 할 수 있을까요? (0) | 2023.06.29 |
GitHub에서 자신의 저장소를 어떻게 포크합니까? (0) | 2023.06.29 |