How to order a data frame by one descending and one ascending column?

前端 未结 10 1671
庸人自扰
庸人自扰 2020-12-02 13:02

I have a data frame, which looks like that:

    P1  P2  P3  T1  T2  T3  I1  I2
1   2   3   5   52  43  61  6   \"b\"
2   6   4   3   72  NA  59  1   \"a\"
3         


        
相关标签:
10条回答
  • 2020-12-02 13:44

    I used this code to produce your desired output. Is this what you were after?

    rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
    2   3   5   52  43  61  6   b
    6   4   3   72  NA  59  1   a
    1   5   6   55  48  60  6   f
    2   4   4   65  64  58  2   b"), header = TRUE)
    rum$I2 <- as.character(rum$I2)
    rum[order(rum$I1, rev(rum$I2), decreasing = TRUE), ]
    
      P1 P2 P3 T1 T2 T3 I1 I2
    1  2  3  5 52 43 61  6  b
    3  1  5  6 55 48 60  6  f
    4  2  4  4 65 64 58  2  b
    2  6  4  3 72 NA 59  1  a
    
    0 讨论(0)
  • 2020-12-02 13:44

    In @dudusan's example, you could also reverse the order of I1, and then sort ascending:

    > rum <- read.table(textConnection("P1  P2  P3  T1  T2  T3  I1  I2
    +   2   3   5   52  43  61  6   b
    +   6   4   3   72  NA  59  1   a
    +   1   5   6   55  48  60  6   f
    +   2   4   4   65  64  58  2   b
    +   1   5   6   55  48  60  6   c"), header = TRUE)
    > f=factor(rum$I1)   
    > levels(f) <- sort(levels(f), decreasing = TRUE)
    > rum[order(as.character(f), rum$I2), ]
      P1 P2 P3 T1 T2 T3 I1 I2
    1  2  3  5 52 43 61  6  b
    5  1  5  6 55 48 60  6  c
    3  1  5  6 55 48 60  6  f
    4  2  4  4 65 64 58  2  b
    2  6  4  3 72 NA 59  1  a
    > 
    

    This seems a bit shorter, you don't reverse the order of I2 twice.

    0 讨论(0)
  • 2020-12-02 13:48

    Let df be the data frame with 2 fields A and B

    Case 1: if your field A and B are numeric

    df[order(df[,1],df[,2]),] - sorts fields A and B in ascending order
    df[order(df[,1],-df[,2]),] - sorts fields A in ascending and B in descending order
    priority is given to A.

    Case 2: if field A or B is non numeric say factor or character

    In our case if B is character and we want to sort in reverse order
    df[order(df[,1],-as.numeric(as.factor(df[,2]))),] -> this sorts field A(numerical) in ascending and field B(character) in descending.
    priority is given to A.

    The idea is that you can apply -sign in order function ony on numericals. So for sorting character strings in descending order you have to coerce them to numericals.

    0 讨论(0)
  • 2020-12-02 13:51

    Simple one without rank :

    rum[order(rum$I1, -rum$I2, decreasing = TRUE), ]
    
    0 讨论(0)
提交回复
热议问题