programing

벡터에 따라 데이터 프레임 행 순서 지정

powerit 2023. 6. 7. 23:20
반응형

벡터에 따라 데이터 프레임 행 순서 지정

아래의 짧은 예에서 구현한 것처럼 데이터 프레임의 행이 "대상" 벡터에 따라 정렬되도록 하는 더 쉬운 방법이 있습니까?

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")

다음에 대한 입력 내용에 유의하십시오.***_jointbls 또는 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

반응형