Sort data frame column by factor

后端 未结 4 2568
自闭症患者
自闭症患者 2020-12-06 00:43

Supose I have a data frame with 3 columns (name, y, sex) where name is character, y is a numeric value and <

相关标签:
4条回答
  • 2020-12-06 01:19

    It sounds to me like you're trying to order by score within the males and females and return a combined data frame of sorted males and sorted females.

    You are right that by(score, score$sex, function(x) x[order(x$y),]) returns a list of sorted data frames, one for male and one for female. You can use do.call with the rbind function to combine these data frames into a single final data frame:

    do.call(rbind, by(score, score$sex, function(x) x[order(x$y),]))
    #           x         y sex
    # F.5    EMMA  7.526866   F
    # F.9  VIOLET  8.182407   F
    # F.3   SUSAN  9.677511   F
    # M.4   LARRY  6.929395   M
    # M.8    MATT  7.970015   M
    # M.7     TIM  8.297137   M
    # M.6 LEONARD  8.845588   M
    # M.2     TOM  9.035948   M
    # M.1    MARK 10.082314   M
    
    0 讨论(0)
  • 2020-12-06 01:26

    I think there must be some function like it to apply on data frames and get data frames as return

    Yes there is:

    library(plyr)
    
    ddply(score, c('y', 'sex'))
    
    0 讨论(0)
  • 2020-12-06 01:29

    Here is a summary of all methods mentioned in other answers/comments (to serve future searchers). I've added a data.table way of sorting.

    # Base R
    do.call(rbind, by(score, score$sex, function(x) x[order(x$y),]))
    with(score, score[order(sex, y, x),])
    score[order(score$sex,score$x),]
    
    # Using plyr
    arrange(score, sex,y)
    ddply(score, c('sex', 'y'))
    
    # Using `data.table`
    library("data.table")
    score_dt <- setDT(score)
    
    # setting a key works sorts the data.table
    setkey(score_dt,sex,x)
    print(score_dt)
    

    Here is Another question that deals with the same

    0 讨论(0)
  • 2020-12-06 01:35

    order takes multiple arguments, and it does just what you want:

    with(score, score[order(sex, y, x),])
    ##         x        y sex
    ## 3   SUSAN 6.636370   F
    ## 5    EMMA 6.873445   F
    ## 9  VIOLET 8.539329   F
    ## 6 LEONARD 6.082038   M
    ## 2     TOM 7.812380   M
    ## 8    MATT 8.248374   M
    ## 4   LARRY 8.424665   M
    ## 7     TIM 8.754023   M
    ## 1    MARK 8.956372   M
    
    0 讨论(0)
提交回复
热议问题