【问题标题】:creating a new column with the order of the data table by certain column does not work [duplicate]按某些列创建具有数据表顺序的新列不起作用[重复]
【发布时间】:2019-02-28 21:07:21
【问题描述】:

我有以下data.table

library (data.table)
dt <- structure(list(variable = c("var1", "var1", 
                            "var2", "var2", "var3", "var3", 
                            "var4", "var4", "var5", "var5"
), src = c("A", "B", 
           "A", "B", 
           "A", "B", 
           "A", "B", 
           "A", "B"
), effect = c(0.00479503189634099, 0.00520945223353099, 0.0414826536175954, 
              0.0534395645078372, 0.00321202935447758, 0.00426201973099257, 
              0.0207942299790097, 0.0268992334286609, 0.304833654398739, 0.291310303107859
)), .Names = c("variable", "src", "effect" ), class = c("data.table", "data.frame"), row.names = c(NA, -10L))

并且我想要src列的效果排名。所以对于srcvariable var5 应该有rank 等于1(对于srcvar5 有最高的effect)。所以我跑了

dt[, rank:=order(effect,  decreasing = T), by=c('src')]

但我明白了

> dt
    variable src       effect rank
 1:     var1   A 0.0047950319    5
 2:     var1   B 0.0052094522    5
 3:     var2   A 0.0414826536    2
 4:     var2   B 0.0534395645    2
 5:     var3   A 0.0032120294    4
 6:     var3   B 0.0042620197    4
 7:     var4   A 0.0207942300    1
 8:     var4   B 0.0268992334    1
 9:     var5   A 0.3048336544    3
10:     var5   B 0.2913103031    3

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: r sorting data.table ranking


    【解决方案1】:

    另一个数据表

    setorder(dt, src, -effect)[, rank := 1:.N, by = src][]
    

    【讨论】:

      【解决方案2】:

      使用dplyr

      dt %>%
        group_by(src) %>%
        mutate(rank = dense_rank(desc(effect)))
      
      # A tibble: 10 x 4
      # Groups:   src [2]
         variable src    effect  rank
         <chr>    <chr>   <dbl> <int>
       1 var1     A     0.00480     4
       2 var1     B     0.00521     4
       3 var2     A     0.0415      2
       4 var2     B     0.0534      2
       5 var3     A     0.00321     5
       6 var3     B     0.00426     5
       7 var4     A     0.0208      3
       8 var4     B     0.0269      3
       9 var5     A     0.305       1
      10 var5     B     0.291       1
      

      或者data.table:

      dt[, rank := rank(desc(effect)), by = list(src)]
      
          variable src      effect rank
       1:     var1   A 0.004795032    4
       2:     var1   B 0.005209452    4
       3:     var2   A 0.041482654    2
       4:     var2   B 0.053439565    2
       5:     var3   A 0.003212029    5
       6:     var3   B 0.004262020    5
       7:     var4   A 0.020794230    3
       8:     var4   B 0.026899233    3
       9:     var5   A 0.304833654    1
      10:     var5   B 0.291310303    1
      

      【讨论】:

      • 或使用data.table::frank:dt[, rank := frank(-effect), by=.(src)]
      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2023-04-02
      • 2022-12-18
      • 2011-10-07
      • 2018-07-07
      相关资源
      最近更新 更多