2010-11-26 4 views
14
df.sorted <- c("binned_walker1_1.grd", "binned_walker1_2.grd", "binned_walker1_3.grd", 
    "binned_walker1_4.grd", "binned_walker1_5.grd", "binned_walker1_6.grd", 
    "binned_walker2_1.grd", "binned_walker2_2.grd", "binned_walker3_1.grd", 
    "binned_walker3_2.grd", "binned_walker3_3.grd", "binned_walker3_4.grd", 
    "binned_walker3_5.grd", "binned_walker4_1.grd", "binned_walker4_2.grd", 
    "binned_walker4_3.grd", "binned_walker4_4.grd", "binned_walker4_5.grd", 
    "binned_walker5_1.grd", "binned_walker5_2.grd", "binned_walker5_3.grd", 
    "binned_walker5_4.grd", "binned_walker5_5.grd", "binned_walker5_6.grd", 
    "binned_walker6_1.grd", "binned_walker7_1.grd", "binned_walker7_2.grd", 
    "binned_walker7_3.grd", "binned_walker7_4.grd", "binned_walker7_5.grd", 
    "binned_walker8_1.grd", "binned_walker8_2.grd", "binned_walker9_1.grd", 
    "binned_walker9_2.grd", "binned_walker9_3.grd", "binned_walker9_4.grd", 
    "binned_walker10_1.grd", "binned_walker10_2.grd", "binned_walker10_3.grd") 

이 벡터의 순서는 1:length(df.sorted) 일 것으로 예상되지만 그렇지는 않습니다. R이 내부적으로 로직에 따라 벡터를 정렬하는 것처럼 보이지만 실제로 생성 된 방식대로 표시하려고 시도합니다 (출력에서도 볼 수 있습니다).R은 자체적으로 벡터를 분류합니다 - 나쁜 소년!

order(df.sorted) 
[1] 37 38 39 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
[26] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 

1:length(df.sorted)에 순서를 '리셋'할 수있는 방법이 있나요? 그렇게하면 벡터의 순서와 출력이 동기화됩니다.

답변

12

구조를 :

> df.new <- ordered(df.sorted,levels=df.sorted) 
> order(df.new) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 

편집 :

이 @DWins 코멘트 후, 난 그냥, 그것에게 주문 요인을 만들어도 nessecary 아님을 추가 할 올바른 수준의 순서를 지정하면 충분합니다.

>  df.new2 <- factor(df.sorted,levels=df.sorted) 
>  order(df.new) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 

차이점은 다음과 같습니다. e 회귀 분석에서 이러한 요소를 사용하면 다르게 처리 될 수 있습니다. 정렬 된 요소의 장점은 비교 연산자를 < 및>로 사용할 수 있다는 것입니다. 이것은 때때로 인생을 훨씬 쉽게 만듭니다.

> df.new2[5] < df.new2[10] 
[1] NA 
Warning message: 
In Ops.factor(df.new[5], df.new[10]) : < not meaningful for factors 

> df.new[5] < df.new[10] 
[1] TRUE 
10

모든 사전 편집용 단락 (예 : ls, 디렉토리의 경우)과 동일하지 않습니다. 이 walker1_foo보다 높습니까?

내 책에서 가장 쉬운 방법은 일치하는 숫자를 사용하는 것입니다. 즉, binned_walker01_1.grd으로 변경하고 한 자리 수에 0을 삽입하는 것입니다. 정렬 된 요소로

+1

때로는 데이터가 처음부터 "손에 퍼지기"보다는 "당신에게옵니다". 그래서 나는 Greg Warnes mixedsort()의 가치를 절대로 무시하지 않을 것입니다. –

15

사용 mixedsort (또는) 패키지 gtools에서 mixedorder 기능 : 더크의 대답에 DWIN의 의견에 대응

require(gtools) 
mixedorder(df.sorted) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
[28] 28 29 30 31 32 33 34 35 36 37 38 39 
+0

+1 : 멋진 도구, 아직 알지 못했습니다. –

+0

+1 : 그 기능을 알지 못했습니다, DWin. –

+0

사실, 내 df.sorted는 gtools :: mixedsort의 결과입니다. :) –

7

: 데이터가 당신의 손에 항상 퍼티이다. "이것은 R이다. 만약 그렇다면 없다." - 사이먼 Blomberg는이

당신과 같이 0을 추가 할 수 있습니다

df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted) 

당신이 00를 추가하는 데 필요한 경우,이처럼 수행

df.sorted <- gsub("(walker)([[:digit:]]{1}_)", "\\10\\2", df.sorted) 
df.sorted <- gsub("(walker)([[:digit:]]{2}_)", "\\10\\2", df.sorted) 

... 등등.

+1

예, 그 방법에 관한 것입니다. 나는 단지 견습생 일 뿐이야. 아마도 언젠가는 나 자신의 빛의 무력을 만들 수 있습니다. 그때까지 나는 다른 것을 사용할 것이다. –

+1

@DWin하지만 다른 사람 만 사용하는 경우 자신의 것을 어떻게 배웁니까? ;-) –

관련 문제