R 데이터프레임 정렬: order() 함수 사용법 및 예제

⚡ 스마트 요약

R에서 데이터프레임을 정렬하려면 `order()` 함수를 사용해야 합니다. 이 함수는 값이 아닌 행의 위치를 ​​반환합니다. 이 위치를 대괄호 안에 넣으면 행이 한 열씩, 여러 열씩 또는 내림차순으로 정렬됩니다.

  • 🔢 order() 기본 사항: order() 함수는 정렬된 값 자체가 아니라 열을 오름차순으로 정렬하는 행 인덱스를 반환합니다.
  • 📌 단일 열: df[order(df$c1), ]는 c1에 저장된 값을 기준으로 프레임의 모든 행을 재배열합니다.
  • 🧮 다중 열: 추가 인수는 동점일 경우 순위를 결정하는 역할을 하므로 order(df$c3, df$c4)는 c3을 기준으로 정렬한 다음 c4를 기준으로 정렬합니다.
  • 🔻 내림차순: 숫자 열 앞에 마이너스 부호를 붙이거나, sort() 함수에 decreasing = TRUE를 전달하세요.
  • 🧩 타이디버스 경로: arrange()와 desc()는 읽기 쉬운 dplyr 동사와 정확히 동일한 정렬 방식을 표현합니다.
  • ⚠️ 누락된 값: order() 함수는 기본적으로 결측값을 마지막에 배치하는 반면, sort() 함수는 na.last가 설정되지 않은 경우 결측값을 제거합니다.

R Order()를 사용하여 데이터 프레임 정렬

R에서 데이터 정렬하기

데이터 분석에서는 다음을 수행할 수 있습니다. 종류 데이터세트의 특정 변수에 따라 데이터를 분석합니다. R에서는 order() 함수의 도움을 받을 수 있습니다. R에서는 연속변수나 요인변수의 벡터를 쉽게 정렬할 수 있습니다. 데이터 정렬은 다음과 같습니다. 오름차순 or 하강하는 주문.

구문 :

sort(x, decreasing = FALSE, na.last = NA)

논쟁:

  • x: 연속형 변수 또는 범주형 변수를 포함하는 벡터
  • 감소정렬 방향을 제어합니다. 기본값은 내림차순이 FALSE로 설정되어 있어 오름차순으로 정렬됩니다.
  • 나.라스트: 결측값(NA)을 마지막에 배치할지 여부를 나타냅니다. sort() 함수는 기본적으로 결측값을 제외하고 NA를 사용하며, order() 함수는 결측값을 유지하고 마지막에 배치합니다.

R에서 sort(), order(), rank() 함수 비교

위의 구문은 sort() 함수에 해당하지만, 이 페이지의 모든 예제에서는 order() 함수를 호출합니다. 두 함수는 서로 다른 목적을 가지고 있으며, 이들을 혼용하는 것이 정렬이 실패하는 가장 흔한 원인입니다. rank() 함수가 나머지 세 함수를 완성합니다.

함수 반품 사용할 때 사용하세요 기본 NA 처리
종류() 가치 자체는 순서대로 정렬된 벡터만 있으면 됩니다. na.last = NA이므로 NA는 삭제됩니다.
주문하다() 정렬 순서를 생성하는 행 위치 데이터프레임 전체를 재정렬해야 합니다. na.last = TRUE이므로 NA가 마지막에 옵니다.
계급() 각 요소의 원래 위치에서의 순위 재정렬된 테이블이 아니라 순위 열이 필요합니다. na.last = TRUE

order() 함수는 위치를 반환하기 때문에 이 페이지 전체에서 사용되는 대괄호 부분집합을 지정할 수 있는 세 가지 함수 중 유일한 함수입니다. R의 order() 함수에 대한 기본 문서 정렬 알고리즘을 선택하는 메서드 인수를 포함하여 모든 인수를 나열합니다.

예제 1: 데이터 프레임을 한 열을 기준으로 정렬하기

예를 들어, tibble 데이터프레임을 생성하고 하나 또는 여러 변수를 정렬할 수 있습니다. tibble 데이터프레임은 기존의 데이터프레임 형식을 현대적으로 재해석한 것입니다. 데이터 프레임tibble은 데이터 프레임의 구문을 개선하고, 특히 문자를 팩터로 변환하는 것과 같은 번거로운 데이터 유형 서식 지정을 방지합니다. 또한, 이 글의 목적에 맞게 데이터 프레임을 직접 생성하는 편리한 방법이기도 합니다. tibble에 대한 자세한 내용은 vignette를 참조하십시오. https://tibble.tidyverse.org/articles/tibble.html

아래 코드는 5개의 무작위 열로 이루어진 50행 tibble을 생성한 다음 c1의 값을 기준으로 각 행을 정렬합니다. set.seed(1234)는 무작위 추첨을 고정하므로 어떤 머신에서도 동일한 숫자가 나타납니다.

library(dplyr)
set.seed(1234)
data_frame <- tibble(  
	c1 = rnorm(50, 5, 1.5),   
	c2 = rnorm(50, 5, 1.5),  
	c3 = rnorm(50, 5, 1.5),
	c4 = rnorm(50, 5, 1.5), 	
	c5 = rnorm(50, 5, 1.5)
)
# Sort by c1
df <-data_frame[order(data_frame$c1),]
head(df)

출력:

# A tibble: 6 x 5
##       c1       c2       c3       c4       c5
##     <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 1.481453 3.477557 4.246283 3.686611 6.0511003
## 2 1.729941 5.824996 4.525823 6.753663 0.1502718
## 3 2.556360 6.275348 2.524849 6.368483 5.4787404
## 4 2.827693 4.769902 5.120089 3.743626 4.0103449
## 5 2.988510 4.395902 2.077631 4.236894 4.6176880
## 6 3.122021 6.317305 5.413840 3.551145 5.6067027

닫는 괄호 앞의 쉼표는 중요합니다. df[order(…), ]는 행의 순서를 바꾸고, df[, order(…)]는 열의 순서를 바꿉니다.

예제 2: 여러 열을 기준으로 정렬하기

order() 함수에 전달되는 추가 인수는 각각 이전 인수와의 우선순위를 결정하는 역할을 합니다. 여기서는 프레임이 c3 값을 기준으로 정렬되고, c3 값이 같은 행들은 c4 값을 기준으로 정렬됩니다.

# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)

출력:

# A tibble: 6 x 5
##        c1       c2       c3       c4       c5
##    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 2.988510 4.395902 2.077631 4.236894 4.617688
## 2 2.556360 6.275348 2.524849 6.368483 5.478740
## 3 3.464516 3.914627 2.730068 9.565649 6.016123
## 4 4.233486 3.292088 3.133568 7.517309 4.772395
## 5 3.935840 2.941547 3.242078 6.464048 3.599745
## 6 3.835619 4.947859 3.335349 4.378370 7.240240

예제 3: 한 열은 내림차순으로, 다른 열은 오름차순으로 정렬

각 열은 고유한 방향을 가질 수 있습니다. 숫자 열 앞에 마이너스 부호를 붙이면 해당 열만 반전되므로 아래 정렬은 c3을 기준으로 내림차순, c4를 기준으로 오름차순으로 실행됩니다.

# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)

출력:

# A tibble: 6 x 5
##         c1       c2       c3        c4       c5
##      <dbl>    <dbl>    <dbl>     <dbl>    <dbl>
## 1 4.339178 4.450214 8.087243 4.5010140 8.410225
## 2 3.959420 8.105406 7.736312 7.1168936 5.431565
## 3 3.339023 3.298088 7.494285 5.9303153 7.035912
## 4 3.397036 5.382794 7.092722 0.7163620 5.620098
## 5 6.653446 4.733315 6.520536 0.9016707 4.513410
## 6 4.558559 4.712609 6.380086 6.0562703 5.044277

마이너스 부호 트릭은 숫자 열에서만 작동합니다. 문자열 또는 팩터 열의 경우 order(xtfrm(df$col), decreasing = TRUE)를 사용하거나 다음에 표시되는 dplyr 접근 방식으로 전환하십시오.

dplyr의 arrange() 함수를 사용하여 데이터프레임을 정렬합니다.

대괄호를 사용하는 방식은 여러 열과 방향이 관련될 경우 프레임 이름이 모든 인수 안에 반복되기 때문에 읽기가 어려워집니다. dplyr `arrange()` 함수는 이러한 반복을 제거합니다. 열 이름은 한 번만 지정되고, `desc()` 함수는 역순으로 나열된 열을 표시합니다.

library(dplyr)
# The same three sorts written with arrange()
data_frame %>% arrange(c1)            # Example 1
data_frame %>% arrange(c3, c4)        # Example 2
data_frame %>% arrange(desc(c3), c4)  # Example 3

알아두면 유용한 세 가지 실질적인 차이점이 있습니다.

  • 가독성: arrange(desc(c3), c4)는 의도를 직접적으로 나타내는 반면 order(-data_frame$c3, data_frame$c4)는 마이너스 부호 뒤에 의도를 숨깁니다.
  • 컬럼 유형desc() 함수는 숫자 열뿐만 아니라 문자열 및 팩터 열에서도 작동하므로 xtfrm()을 이용한 해결 방법이 필요하지 않습니다.
  • 결 측값arrange() 함수는 방향에 관계없이 항상 NA 값을 맨 마지막에 배치하는 반면, order() 함수는 na.last를 사용하여 NA 값을 이동할 수 있습니다.

arrange() 함수는 원본 데이터 프레임을 그대로 두고 새로운 데이터 프레임을 반환합니다. 이는 대괄호를 사용한 버전과 동일하므로, 결과 프레임을 저장하려면 이름을 지정해야 합니다. 그룹화된 프레임은 .by_group = TRUE 옵션을 제공했을 때만 각 그룹 내에서 정렬됩니다.

R에서 문자형 데이터, 요인형 데이터 및 결측값 정렬하기

숫자 열은 예측 가능한 방식으로 정렬됩니다. 하지만 텍스트, 범주 및 공백은 그렇지 않으며, 이 세 가지 각각에 대해 다른 결정이 필요합니다.

결측값입니다. sort()와 order() 함수는 NA 값을 어떻게 처리할지에 대해 의견이 다르기 때문에 동일한 열에 대해 서로 다른 행 개수 계산 결과가 나올 수 있습니다.

x <- c(3, NA, 1, 2)
sort(x)                    # missing values dropped
sort(x, na.last = TRUE)    # missing values pushed to the end
order(x)                   # NA indexed last by default
order(x, na.last = FALSE)  # NA indexed first

요인. A 인자 알파벳순이 아니라 레벨 순서대로 정렬됩니다. 이는 낮음, 중간, 높음과 같이 순서가 있는 범주에 원하는 결과이며, 값이 나타난 순서대로 레벨이 생성된 경우에는 원하지 않는 결과입니다.

grades <- factor(c("low", "high", "medium"),
                 levels = c("low", "medium", "high"))
sort(grades)                # follows the level order
sort(as.character(grades))  # plain alphabetical order

문자 열. 일반 텍스트는 로케일 정렬 방식에 따라 정렬되므로 대소문자와 악센트 기호로 인해 기기마다 정렬 결과가 달라질 수 있습니다. 이러한 문제를 방지하려면 다음 두 가지를 실천하세요. 정렬하기 전에 `class(df$col)`을 확인하고, 텍스트로 저장된 숫자는 `as.numeric()`을 사용하여 숫자로 변환하여 "10"이 "2"보다 앞에 오지 않도록 합니다.

자주 묻는 질문

`df[order(rownames(df)), ]`를 사용하세요. 행 이름은 문자열이므로 텍스트 정렬을 따르며 "10"이 "2"보다 앞에 옵니다. 행 이름이 숫자인 경우에는 `as.numeric()`으로 감싸주세요. Tibbles는 행 이름을 완전히 생략하므로 대신 명시적인 ID 열을 추가하세요.

정수 및 짧은 문자열의 경우 가장 빠른 정렬 방식인 `order()` 메서드에 `method = “radix”`를 전달하세요. 수백만 개의 행이 있는 경우 `data.table::setorder()`는 테이블을 복사하지 않고 제자리에서 정렬하며, `dplyr` 동사의 `arrange()`는 이미 내부적으로 기수 정렬을 사용합니다.

역순으로 인덱싱합니다: df[nrow(df):1, ]. 이렇게 하면 정렬하는 대신 현재 순서를 뒤집습니다. 이는 프레임이 섞이거나 그룹화된 경우에 중요합니다. 레이블이 혼란스러워 보이면 나중에 rownames(df) <- NULL을 사용하여 레이블을 재설정하세요.

해당 열은 문자 또는 팩터로 저장되어 있으므로 R은 이를 텍스트로 비교하여 "10"을 "2" 앞에 배치합니다. 정렬하기 전에 class(df$col)을 사용하여 확인한 다음 as.numeric(as.character(df$col))을 사용하여 변환하십시오.

아니요. `order()`는 인덱스 벡터를 반환하고 `df[order(…), ]`는 새로운 프레임을 생성하므로 결과가 다시 할당될 때까지 원래 프레임은 변경되지 않고 그대로 유지됩니다. 행 이름은 이전 값을 유지하므로 프레임 순서가 변경되었음을 알 수 있는 유용한 단서가 됩니다.

AI 어시스턴트는 숫자 정렬이 잘못된 것처럼 보일 때 텍스트로 저장된 열을 감지하고, 기본 R 함수 `order()` 호출을 dplyr 파이프라인으로 변환하며, 안정적인 동점 처리 열을 제안할 수 있습니다. 하지만 결과를 신뢰하기 전에 항상 코드를 실행하고 `head()`를 출력하여 확인하십시오.

예. GitHub 부조종사 RStudio Desktop 2023.09.0 이상 버전에서 작동하며, 일반 주석에서 order() 및 arrange() 함수 호출을 자동으로 완료합니다. Posit은 제안 내용이 비결정적일 수 있으므로 실행하기 전에 각 줄을 검토하라고 경고합니다.

행 인덱스 대신 열 인덱스를 재정렬합니다. `df[, order(names(df))]`는 열을 알파벳순으로 정렬하고, `df[, c(“c3”, “c1”)]`는 지정된 순서를 선택합니다. dplyr 사용자는 `select(df, c3, c1)`을 호출하여 한 단계로 재정렬 및 ​​부분집합을 추출할 수 있습니다.

이 게시물을 요약하면 다음과 같습니다.