从 R 中的 data.table 按组返回第二个最大值

标签 r data.table max

如何在 R 数据表中按组返回第二个最大值,同时返回 id 列?

下面的可重现示例:

library(data.table)
sample_dt <- data.table(
  myid=c("A","B","B","A","B","B","C","C","A","A"),
  mycol1 =c(101,-108,140,140,-150,-140,-111,101,150,140)
)

#desired output 
desired_dt <- data.table(
  myid=c("A","B","C"),
  mycol1_secondmax=c(140,-108,-111)
)

最佳答案

可能的解决方案:

sample_dt[order(-mycol1),.SD[2],by=myid]
     myid mycol1
   <char>  <num>
1:      A    140
2:      B   -108
3:      C   -111

编辑:与 frank 和其他人的比较

sample_dt <- data.table(
  myid=sample(LETTERS,10^4,replace=T),
  mycol1 =sample(-100:100,10^4,replace=T)
)

microbenchmark::microbenchmark(
  sample_dt[order(-mycol1),.SD[2],by=myid],
  sample_dt[, .SD[frank(-mycol1, ties.method = "first") == 2L,], by = .(myid)],
  sample_dt[, .SD[order(-mycol1) == 2], myid]
  )

Unit: milliseconds
                                                                               expr      min       lq     mean   median       uq     max neval
                                       sample_dt[order(-mycol1), .SD[2], by = myid] 1.450001 1.850001 3.139760 3.145701 3.899852 13.6538   100
 sample_dt[, .SD[frank(-mycol1, ties.method = "first") == 2L,      ], by = .(myid)] 6.816001 7.199701 8.289604 7.638501 8.390902 22.0289   100
                                        sample_dt[, .SD[order(-mycol1) == 2], myid] 4.503801 4.824001 5.606895 5.229701 5.872300 15.9330   100

关于从 R 中的 data.table 按组返回第二个最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74411512/

相关文章:

r - 以更快的方式(使用更少的内存)编写 ifelse()

r - 如何使用data.table在日期范围内执行联接?

R:使用 MatchIt 进行倾向得分匹配。如何使用replace = TRUE查找匹配观察值的数量?

r - 使用偏移变量模拟负二项式分布

r - 展开 data.tables 的列表列

python - 抓取字典中字典中值最高的键

r - 如何减少保持其他列顺序的数据框

R dplyr 到数据表 - 分组和过滤

mysql - SQL : I search the good query with select max() and select count()

java - 尝试在java中打印arraylist的最大值