벡터에 따라 데이터 프레임 행 순서 지정
아래의 짧은 예에서 구현한 것처럼 데이터 프레임의 행이 "대상" 벡터에 따라 정렬되도록 하는 더 쉬운 방법이 있습니까?
df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))
df
# name value
# 1 a TRUE
# 2 b TRUE
# 3 c FALSE
# 4 d FALSE
target <- c("b", "c", "a", "d")
이 작업을 수행하기에는 다소 "복잡한" 작업인 것 같습니다.
idx <- sapply(target, function(x) {
which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL
df
# name value
# 1 b TRUE
# 2 c FALSE
# 3 a TRUE
# 4 d FALSE
해라match
:
df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")
df[match(target, df$name),]
name value
2 b TRUE
3 c FALSE
1 a TRUE
4 d FALSE
그것은 당신의 것만큼 오래 작동할 것입니다.target
와 정확히 동일한 요소를 포함합니다.df$name
둘 다 중복 값을 포함하지 않습니다.
부터?match
:
match returns a vector of the positions of (first) matches of its first argument
in its second.
그러므로match
일치하는 행 번호를 찾습니다.target
의 요소들, 그리고 우리는 돌아옵니다.df
그 차례로.
다음을 기준으로 요인 수준을 조정할 수 있습니다.target
그리고 그것을 사용합니다.arrange
library(dplyr)
df %>% arrange(factor(name, levels = target))
# name value
#1 b TRUE
#2 c FALSE
#3 a TRUE
#4 d FALSE
또는order
그것과 그것을 사용합니다.slice
df %>% slice(order(factor(name, levels = target)))
사용하는 것을 선호합니다.***_join
안에dplyr
데이터를 일치시켜야 할 때는 언제든지.이것에 대한 한 번의 가능한 시도
left_join(data.frame(name=target),df,by="name")
다음에 대한 입력 내용에 유의하십시오.***_join
tbls 또는 data.frame이 필요합니다.
이 방법은 조금 다릅니다. 이전 답변보다 조금 더 유연하게 답변할 수 있었습니다.주문된 인자로 만들면, 당신은 그것을 잘 사용할 수 있습니다.arrange
등등.에서 리오더.팩터를 사용했습니다.gdata
꾸러미
df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")
require(gdata)
df$name <- reorder.factor(df$name, new.order=target)
다음으로, 이제 주문되었다는 사실을 사용합니다.
require(dplyr)
df %>%
arrange(name)
name value
1 b TRUE
2 c FALSE
3 a TRUE
4 d FALSE
원래(알파벳) 순서로 돌아가려면 다음을 사용하십시오.as.character()
원래 상태로 되돌리기 위해서입니다.
라이브러리를 사용하지 않고 데이터에 반복이 있는 경우which
와 함께sapply
뿐만 아니라.
new_order <- sapply(target, function(x,df){which(df$name == x)}, df=df)
df <- df[new_order,]
다음은 처음에는 정렬할 변수가 있지만, 처음에는 이 보조 변수가 처음 정렬할 때 나타나는 순서에 따라 보조 변수로 정렬하려는 상황에 대한 유사한 시스템입니다.
아래 함수에서는 초기 정렬 변수를 다음과 같이 부릅니다.order_by
그리고 2차 변수는 다음과 같이 불립니다.order_along
"초기 순서에 따라 이 변수에 따라 정렬"하는 것과 같습니다.
library(dplyr, warn.conflicts = FALSE)
df <- structure(
list(
msoa11hclnm = c(
"Bewbush", "Tilgate", "Felpham",
"Selsey", "Brunswick", "Ratton", "Ore", "Polegate", "Mile Oak",
"Upperton", "Arundel", "Kemptown"
),
lad20nm = c(
"Crawley", "Crawley",
"Arun", "Chichester", "Brighton and Hove", "Eastbourne", "Hastings",
"Wealden", "Brighton and Hove", "Eastbourne", "Arun", "Brighton and Hove"
),
shape_area = c(
1328821, 3089180, 3540014, 9738033, 448888, 10152663, 5517102,
7036428, 5656430, 2653589, 72832514, 826151
)
),
row.names = c(NA, -12L), class = "data.frame"
)
이것은 내가 필요로 하는 것을 주지 않습니다.
df %>%
dplyr::arrange(shape_area, lad20nm)
#> msoa11hclnm lad20nm shape_area
#> 1 Brunswick Brighton and Hove 448888
#> 2 Kemptown Brighton and Hove 826151
#> 3 Bewbush Crawley 1328821
#> 4 Upperton Eastbourne 2653589
#> 5 Tilgate Crawley 3089180
#> 6 Felpham Arun 3540014
#> 7 Ore Hastings 5517102
#> 8 Mile Oak Brighton and Hove 5656430
#> 9 Polegate Wealden 7036428
#> 10 Selsey Chichester 9738033
#> 11 Ratton Eastbourne 10152663
#> 12 Arundel Arun 72832514
기능은 다음과 같습니다.
order_along <- function(df, order_along, order_by) {
cols <- colnames(df)
df <- df %>%
dplyr::arrange({{ order_by }})
df %>%
dplyr::select({{ order_along }}) %>%
dplyr::distinct() %>%
dplyr::full_join(df) %>%
dplyr::select(dplyr::all_of(cols))
}
order_along(df, lad20nm, shape_area)
#> Joining, by = "lad20nm"
#> msoa11hclnm lad20nm shape_area
#> 1 Brunswick Brighton and Hove 448888
#> 2 Kemptown Brighton and Hove 826151
#> 3 Mile Oak Brighton and Hove 5656430
#> 4 Bewbush Crawley 1328821
#> 5 Tilgate Crawley 3089180
#> 6 Upperton Eastbourne 2653589
#> 7 Ratton Eastbourne 10152663
#> 8 Felpham Arun 3540014
#> 9 Arundel Arun 72832514
#> 10 Ore Hastings 5517102
#> 11 Polegate Wealden 7036428
#> 12 Selsey Chichester 9738033
2021-01-12에 reprex 패키지(v0.3.0)에 의해 생성되었습니다.
언급URL : https://stackoverflow.com/questions/11977102/order-data-frame-rows-according-to-vector-with-specific-order
'programing' 카테고리의 다른 글
HttpContext에 액세스할 수 없습니다.현재의 (0) | 2023.06.07 |
---|---|
패싯 레이블 글꼴 크기 (0) | 2023.06.07 |
해시로 커밋을 찾는 방법은 무엇입니까? (0) | 2023.06.07 |
SQL Server에서 세미콜론을 언제 사용해야 합니까? (0) | 2023.06.07 |
명령 및 인수와 함께 python 하위 프로세스를 사용하는 동안 "OSError: [Errno 2] 해당 파일 또는 디렉터리 없음" (0) | 2023.06.07 |