HOWTO · R
R의 열별로 중복 행 제거
이 문서에서는 R에서 열별로 중복 행을 제거하는 방법을 보여줍니다
이 페이지의 내용
R 데이터 프레임에서 선택한 키마다 한 행을 유지하려면 다른 열이 필요할 때 dplyr의 distinct()를 .keep_all = TRUE와 함께 사용하세요. 아래 각 방법은 현재 데이터 순서에서 가장 먼저 일치하는 행을 유지하므로, 다른 레코드가 우선해야 할 때는 먼저 정렬하세요. 예제에서는 id, group, score 열이 있는 작은 데이터 프레임을 사용합니다.
dplyr 패키지의 distinct 함수를 사용하여 R에서 열별로 중복 행 제거
id가 고유한 레코드를 정의하고 결과에 원래의 모든 열이 필요할 때 distinct(df, id, .keep_all = TRUE)를 사용하세요. distinct()는 선택한 키 열을 비교하고 각 키 값에 대해 첫 번째 행을 유지합니다. .keep_all = TRUE를 사용하면 다른 열도 결과에 포함되지만, 두 행이 일치하는지 여부에는 영향을 주지 않습니다. 해당 인수가 없으면 결과에는 선택한 열만 포함됩니다.
복합 키의 경우 각 열을 나열하세요: distinct(df, id, group, .keep_all = TRUE). 그러면 id는 같지만 group 값이 다른 행은 분리된 상태로 남습니다. 다음의 완전한 예제는 동일한 샘플 데이터를 사용하고 두 가지 키 선택을 모두 보여줍니다. 이를 실행하려면 dplyr가 설치되어 있어야 합니다. 그 결과는 아래에 설명되어 있으며, 이 예제에는 런타임 출력이 함께 제공되지 않습니다.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
if (requireNamespace("dplyr", quietly = TRUE)) {
unique_by_id <- dplyr::distinct(df, id, .keep_all = TRUE)
unique_by_pair <- dplyr::distinct(df, id, group, .keep_all = TRUE)
print(unique_by_id)
print(unique_by_pair)
} else {
cat("Install dplyr to run these distinct() examples.\n")
}
단일 키 결과는 (1, A, 8), (2, A, 5), (3, A, 4)를 유지합니다. 복합 키 결과는 각 id와 group 쌍이 고유하므로 해당 행에 더해 (2, B, 9)와 (3, B, 7)를 유지합니다. 다음의 별도 base R 예제는 두 결과를 모두 출력합니다.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
unique_by_id <- df[!duplicated(df$id), ]
unique_by_pair <- df[!duplicated(df[c("id", "group")]), ]
cat("By id:\n")
cat(paste(unique_by_id$id, unique_by_id$group, unique_by_id$score, sep = ":"), sep = "\n")
cat("\nBy id and group:\n")
cat(paste(unique_by_pair$id, unique_by_pair$group, unique_by_pair$score, sep = ":"), sep = "\n")
By id:
1:A:8
2:A:5
3:A:4
By id and group:
1:A:8
2:A:5
2:B:9
3:A:4
3:B:7
여기서 !duplicated(df$id)는 각 id의 이후 등장을 표시합니다. 키 열들로 이루어진 데이터 프레임을 duplicated()에 전달하면 그 조합에도 동일한 첫 등장 규칙이 적용됩니다. 두 선택 모두 선택한 각 행의 모든 열을 유지합니다.
group_by, filter, duplicated 함수를 사용하여 R에서 열별로 중복 행 제거
하나의 전역 id 키에 대해 filter(!duplicated(id))는 그 첫 번째 등장을 유지합니다. 입력이 이미 그룹화되어 있을 수 있다면 먼저 ungroup()를 호출하여 filter()가 전체 데이터에 대해 중복 검사를 평가하도록 하세요:
df %>% ungroup() %>% filter(!duplicated(id))
파이프 %>%는 왼쪽의 값을 오른쪽 함수의 첫 번째 인수로 전달합니다. filter(!duplicated(id)) 전에 id로 그룹화해도 이후 행이 제거되지 않습니다. 각 id 그룹 안에서는 해당 키가 일정하므로 duplicated(id)는 이후 등장을 찾지 못합니다. 다른 열로 그룹화하는 것은 ID가 각 그룹 안에서 독립적으로 반복될 수 있을 때 유용합니다. 그러면 duplicated(id)는 각 그룹에서 각 ID의 첫 번째 등장을 유지합니다. 하나의 전역 키에 대해 그룹화되지 않은 식은 위의 base R 선택과 동일한 첫 행 동작을 합니다.
예를 들어 group으로 그룹화하면 동일한 검사가 각 그룹 안에서 별도로 적용됩니다:
df %>%
group_by(group) %>%
filter(!duplicated(id)) %>%
ungroup()
이 파이프라인은 현재 행 순서에 따라 각 group 안에서 각 id의 첫 번째 행을 유지합니다. 샘플 데이터에서는 각 id와 group 쌍이 한 번씩만 나타나므로, 각 행은 해당 그룹 안에서 그 id의 첫 번째 등장이며 다섯 행이 모두 유지됩니다. 같은 그룹에서 이미 본 id를 반복하는 행이 추가로 있으면 삭제됩니다.
group_by와 slice 함수를 사용하여 R에서 열별로 중복 행 제거
dplyr 파이프라인 df %>% group_by(id) %>% slice(1) %>% ungroup()는 각 id 그룹에서 위치 1을 선택합니다. 현재 행 순서가 어떤 레코드가 첫 번째인지 결정합니다. slice(1)은 가장 높은 점수나 가장 최근 레코드를 자동으로 선택하지 않습니다. 그룹화와 슬라이싱 전에 원하는 우선순위에 따라 데이터를 정렬하고, 이후 연산에서 결과를 일반 데이터 프레임으로 취급해야 할 때는 그룹화를 해제하세요.
샘플 데이터에서 이 방법은 단일 키 distinct() 및 duplicated() 접근법과 동일한 행, 즉 ID 1, 2, 3의 첫 번째 행을 유지합니다. 고유한 키 조합을 선택하는 것이 작업일 때는 distinct()를 사용하고, 각 그룹 내 위치로 행을 선택하는 것이 더 넓은 그룹화 워크플로의 일부일 때는 slice(1)을 사용하세요. 이러한 dplyr 식은 예시용이며 dplyr 패키지가 필요합니다. 위의 base R 예제는 해당 종속성 없이 실행됩니다.