【问题标题】:Ranking within group and keep id in R data.table在组内排名并在 R data.table 中保留 id
【发布时间】:2017-02-15 04:58:16
【问题描述】:

我有一个带有两个分组变量的 data.table。我想计算关于组变量 1 的排名,同时仍然保留组的信息。

# require(data.table)
# require(dplyr)

set.seed(1)
DT <- data.table(group = c(rep(1,5), rep(2, 5)), 
                 id = c(letters[1:5], letters[1:5]),
                 var1 = rnorm(10),
                 var2 = runif(10))
# > DT
#      group id       var1       var2
#  1:      1  a -0.6264538 0.93470523
#  2:      1  b  0.1836433 0.21214252
#  3:      1  c -0.8356286 0.65167377
#  4:      1  d  1.5952808 0.12555510
#  5:      1  e  0.3295078 0.26722067
#  6:      2  a -0.8204684 0.38611409
#  7:      2  b  0.4874291 0.01339033
#  8:      2  c  0.7383247 0.38238796
#  9:      2  d  0.5757814 0.86969085
# 10:      2  e -0.3053884 0.34034900

我可以使用

计算组内排名
DT[, lapply(.SD, function(x) percent_rank(x)), 
   .SDcols = c("var1", "var2"), by = .(group)]

#     group var1 var2
#  1:     1 0.25 1.00
#  2:     1 0.50 0.25
#  3:     1 0.00 0.75
#  4:     1 1.00 0.00
#  5:     1 0.75 0.50
#  6:     2 0.00 0.75
#  7:     2 0.50 0.00
#  8:     2 1.00 0.50
#  9:     2 0.75 1.00
# 10:     2 0.25 0.25

我还想在新表中保留id 列,如

#     group id var1 var2
#  1:     1  A 0.25 1.00
#  2:     1  B 0.50 0.25
#  3:     1  C 0.00 0.75
#  4:     1  D 1.00 0.00
#  5:     1  E 0.75 0.50
#  6:     2  A 0.00 0.75
#  7:     2  B 0.50 0.00
#  8:     2  C 1.00 0.50
#  9:     2  D 0.75 1.00
# 10:     2  E 0.25 0.25

【问题讨论】:

  • 您也可以将id 变量放在选择中,尽管这有点尴尬 - DT[, c(.(id=id), lapply(.SD, percent_rank)), .SDcols = c("var1", "var2"), by = .(group)]
  • @thelatemail 谢谢!我不知道我能做到这一点!
  • 或者只是将它们分配回DT[, c("var1", "var2") := lapply(.SD, percent_rank), .SDcols = c("var1", "var2"), by = group]

标签: r data.table ranking


【解决方案1】:

使用 data.table

DT[,`:=`(var1 = percent_rank(var1),
        var2 = percent_rank(var2))]

使用 dplyr

DT %>% mutate(var1 = percent_rank(var1),
              var2 = percent_rank(var2))

【讨论】:

  • 在 dplyr 中无需引用 DT$... - 只需 percent_rank(var1) 即可。
  • @thelatemail 谢谢。修好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2019-02-01
  • 2020-08-19
  • 1970-01-01
  • 2014-09-14
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多