2017-03-16 13 views
2

(열 순서에 따라) : 현실에서R 정렬 한 열 상승, 다른 모든 내림차순 내가 다음에 비슷한 표를 주문한

df <- read.table(text = 
"A B C Size 
1 0 0 1 
0 1 1 2 
0 0 1 1 
1 1 0 2 
0 1 0 1", 
header = TRUE) 

이 더 많은 열 수 있지만이가 괜찮 것이다 해결책.

의해 다음, SIZE (오름차순)에 의해 첫 번째 우선 순위의 순서는 서로 컬럼 (내림차순)이 테이블을 정렬하고자 - 컬럼으로, 즉 제 다음 B하고 C 등

문제는 미리 열 이름을 알 수 없으므로 이름을 지정할 수 없지만 사실상 "SIZE를 제외한 모든 열"이 필요하다는 것입니다. 나는 두 개의 열로 정렬의 예를 본 적이

A B C Size 
1 0 0 1 
0 1 0 1 
0 0 1 1 
1 1 0 2 
0 1 1 2 

,하지만 난 그냥 올바른 구문은 '다른 모든 열을 순차적으로'기준으로 정렬 할 찾을 수 없습니다 :

최종 결과가 있어야한다.

많은 감사

+0

모든 열이 숫자 또는 정수입니까? –

답변

3

우리는 이름으로

cols <- paste0("desc(", names(df)[1:3], ")") 
arrange_(df, .dots = c("Size", cols)) 
2

이 같은 order를 사용 arrange_ 사용할 수 있습니다, 열 개 번호는 dplyr

library(dplyr) 
arrange(df, Size, desc(A), desc(B), desc(C)) 

에서 arrange을 사용할 수 있습니다 . 패키지가 사용되지 않습니다.

o <- with(df, order(Size, -A, -B, -C)) 
df[o, ] 

이 제공 : Size 항상 마지막 열은를 사용하는 경우

o <- order(df[[4]], -df[[1]], -df[[2]], -df[[3]]) 

또는

k <- 4 
o <- do.call("order", data.frame(df[[k]], -df[-k])) 

:

A B C Size 
1 1 0 0 1 
5 0 1 0 1 
3 0 0 1 1 
4 1 1 0 2 
2 0 1 1 2 

또는 이름이없는

그냥 열 번호를 사용대신에 항상 크기가 아니라 항상 마지막 크기 인 경우 k <- match("Size", names(df))을 사용하십시오.

참고 : 열이 숫자가 아니었다면 그 다음 일이 그렇게 그들을 부정 할 수없는 질문의 예에서 필요하지 않지만는보다 일반적인 솔루션과 위의 첫 번째 라인을 교체하는 것입니다 xtfrm이를 여기서 다음 R 함수는 결과를 예상대로 정렬하도록 개체를 숫자로 변환합니다.

o <- with(df, order(Size, -xtfrm(A), -xtfrm(B), -xtfrm(C))) 
+0

열은 숫자이지만 각 실행마다 다를 수 있으므로 명시 적으로 이름을 지정하지 않으려합니다. – Jon

+0

메모 바로 앞에있는 추가 부분을 참조하십시오. –