HOWTO · R
R에서 두 데이터 프레임 결합
이 자습서에서는 R에서 두 데이터 프레임을 결합하는 방법을 살펴봅니다. 같은 구조의 행을 추가할 때는 `rbind()`, 열이 서로 다를 수 있는 행 결합에는 `dplyr::bind_rows()`, ID 같은 키로 관련 행을 연결할 때는 `plyr::join()` 또는 기본 `merge()`를 사용할 수 있습니다. 성능은 데이터와 환경에 따라 달라지므로, 속도 향상이나 사용자 지정 최적화를 기대하기 전에 대표 입력으로 측정해 보세요.
이 페이지의 내용
R에서 두 데이터 프레임을 결합하려면 먼저 레코드를 추가할지, 관련 레코드를 서로 맞출지 결정하세요. 두 입력이 같은 종류의 레코드를 담고 있고 열 구조가 호환된다면 rbind()를 사용하세요. 한쪽 입력에만 있는 열도 포함해 행을 결합하려면 dplyr::bind_rows()를 사용할 수 있습니다. ID 같은 키를 기준으로 행을 연결하려면 plyr::join()이나 기본 merge()를 사용하세요. 아래 예제는 작은 표를 사용하므로 열 이름과 값을 실제 데이터에 맞게 바꿔 적용할 수 있습니다.
R에서 rbind() 함수로 두 데이터 프레임 결합하기
기본 R의 rbind()는 한 데이터 프레임의 행 뒤에 다른 데이터 프레임의 행을 덧붙입니다. 두 입력의 열 이름이 서로 일치하고 값의 구조가 호환되어야 합니다. 열의 순서보다 이름이 중요합니다. rbind()는 이름을 기준으로 열을 맞추므로 값이 올바른 열 제목 아래에 놓입니다. 이름이 다른 열을 합쳐 열의 전체 집합을 만들거나, 누락된 필드를 자동으로 채우지는 않습니다. 입력의 필드 구성이 다르다면 먼저 구조를 통일하거나 bind_rows()를 사용하세요.
다음 예제에서는 구조가 같은 표 두 개를 만들고 rbind()로 레코드를 쌓습니다.
x <- data.frame(
id = c(1, 2),
score = c(88, 91)
)
y <- data.frame(
id = c(3, 4),
score = c(85, 96)
)
combined <- rbind(x, y)
print(combined)
id score
1 1 88
2 2 91
3 3 85
4 4 96
결과의 각 행은 같은 변수에 대한 관측값 하나를 나타냅니다. 첫 번째 표의 행이 먼저 나오고 그 뒤에 두 번째 표의 행이 이어집니다. 데이터 프레임의 필드 구성이 서로 다르다면 bind_rows()를 사용해 없는 값을 NA로 표시할 수 있습니다.
R에서 dplyr 패키지로 두 데이터 프레임 결합하기
dplyr 패키지의 bind_rows()는 입력 데이터 프레임의 열 구성이 다를 때 레코드를 쌓는 데 사용할 수 있습니다. 열 이름을 기준으로 맞추고 두 입력 중 어느 한쪽에 있는 열을 모두 포함합니다. 특정 열의 값이 없는 행에는 NA가 들어갑니다. 두 데이터 원본이 같은 종류의 레코드를 설명하지만 한쪽에만 추가 필드가 있을 때 유용합니다. 이 함수도 행 결합이므로 ID를 기준으로 레코드를 연결하지는 않습니다.
직접 작성한 스크립트에서 dplyr::bind_rows()를 사용하려면 install.packages("dplyr")로 dplyr를 설치하세요. 예제는 패키지가 설치되어 있으면 해당 함수를 우선 사용합니다. 설치되어 있지 않으면 기본 R 대체 코드가 같은 이름의 열을 맞추고 누락된 값을 NA로 채우므로 추가 패키지 없이도 예제를 실행할 수 있습니다.
first <- data.frame(id = 1, score = 88)
second <- data.frame(id = 2, group = "B")
if (requireNamespace("dplyr", quietly = TRUE)) {
combined <- dplyr::bind_rows(first, second)
} else {
columns <- union(names(first), names(second))
align_columns <- function(data) {
for (column in setdiff(columns, names(data))) data[[column]] <- NA
data[columns]
}
combined <- rbind(align_columns(first), align_columns(second))
}
cat("id score group\n")
for (i in seq_len(nrow(combined))) {
score <- if (is.na(combined$score[i])) "NA" else as.character(combined$score[i])
group <- if (is.na(combined$group[i])) "NA" else combined$group[i]
cat(paste(combined$id[i], score, group), "\n", sep = "")
}
id score group
1 88 NA
2 NA B
R에서 plyr 패키지로 두 데이터 프레임 결합하기
plyr 패키지의 join()은 키 열을 기준으로 관련 행을 결합합니다. 행을 쌓는 함수가 아니라 조인 함수입니다. 공유 키를 by에 지정하세요. type = "inner"이면 두 입력에 모두 있는 키만 결과에 남고, 기본값인 type = "left"이면 첫 번째 입력의 모든 행이 유지됩니다. 직접 작성한 스크립트에서 plyr::join()을 사용하려면 install.packages("plyr")로 plyr를 설치하세요. 예제는 함수를 사용할 수 있으면 우선 사용하고, 그렇지 않으면 같은 내부 조인 결과를 얻도록 기본 merge()를 사용합니다. 다른 조인 유형을 선택할 때는 설치된 패키지에서 ?plyr::join을 확인하세요.
people <- data.frame(id = c(1, 2), name = c("Ada", "Ben"))
ages <- data.frame(id = c(2, 3), age = c(25, 30))
if (requireNamespace("plyr", quietly = TRUE)) {
matched <- plyr::join(people, ages, by = "id", type = "inner")
} else {
matched <- merge(people, ages, by = "id")
}
cat("id name age\n")
for (i in seq_len(nrow(matched))) {
cat(paste(matched$id[i], matched$name[i], matched$age[i]), "\n", sep = "")
}
id name age
2 Ben 25
R에서 merge() 함수로 두 데이터 프레임 결합하기
기본 R의 merge()는 키 열의 값이 일치하는 행끼리 데이터 프레임을 조인합니다. 두 입력에 같은 이름의 열이 있으면 by로 해당 키를 지정합니다. 기본적으로 양쪽 입력에서 키가 일치하는 행만 유지하므로 내부 조인에 해당합니다. all.x = TRUE를 설정하면 x의 모든 행을, all.y = TRUE를 설정하면 y의 모든 행을 유지합니다. 두 옵션을 모두 사용하면 양쪽의 일치하지 않는 행도 포함됩니다. 키 열의 자료형이 서로 호환되는지, 중복 키가 의도된 것인지 확인하세요. 키가 반복되면 결과에 여러 행이 생길 수 있습니다.
다음은 독립적으로 실행할 수 있는 예제로, id를 기준으로 표 두 개를 조인하고 일치하는 레코드를 출력합니다.
people <- data.frame(
id = c(1, 2, 3),
name = c("Ada", "Ben", "Cy")
)
ages <- data.frame(
id = c(2, 3, 4),
age = c(25, 30, 35)
)
matched <- merge(people, ages, by = "id")
print(matched)
id name age
1 2 Ben 25
2 3 Cy 30
일치하는 나이가 없는 사람도 포함해 모든 사람을 결과에 남기려면 merge(people, ages, by = "id", all.x = TRUE)를 사용하세요. 기본 merge()는 sort = FALSE를 지정하지 않는 한 키 기준으로 결과를 정렬합니다. 위 표는 이 예제에서 제공된 관찰 결과입니다.
결론
같은 구조의 행을 덧붙이려면 rbind()를 선택하세요. 열 구성이 다른 입력의 행을 결합하면서 누락된 칸을 NA로 채우려면 dplyr::bind_rows()를 사용할 수 있습니다. 키를 기준으로 관련 레코드를 연결하려면 plyr::join()이나 merge()를 선택하세요. 기본 merge()는 추가 패키지 없이 사용할 수 있고, 일치하지 않는 행을 유지하는 옵션도 제공합니다. 큰 데이터를 결합하기 전에는 키의 고유성, 열의 자료형, 작업이 행 결합인지 조인인지 확인하세요. 성능은 데이터와 환경에 따라 달라지므로, 속도 향상이나 사용자 지정 최적화를 적용하기 전에 대표 입력으로 성능을 측정하세요.