【问题标题】:how to filter the row with max value(more than 1) in multiple columns by data.table如何通过data.table过滤多列中具有最大值(大于1)的行
【发布时间】:2017-03-05 06:53:58
【问题描述】:

我有一个这样的 data.table:

set.seed(1)    
dt <- data.frame(names = sample(letters[1:3],15,replace = T),
                 v1 = c(1:10,11,11,3:5),
                 v2 = c(32,32,13:1))

我想按名称过滤具有 max v1 和 v2 的行,这适用于以下代码:

setDT(dt)[,.SD[v1 == max(v1)],by = names][,.SD[v2 == max(v2)],by = names]

但代码比我想要的要长一点。然后我尝试了这个:

setDT(dt)[,.SD[v1 == max(v1) & v2 == max(v2)],by = names]

它会抛出“3 列的空 data.table(0 行):名称、v1、v2。”不知道为什么,有大神能指教一下吗?

【问题讨论】:

  • 这是因为两个列的最大值行不同。由于顺序子集,第一个代码通过返回子集中的最大值来工作。由于&amp;,第二个代码没有返回匹配的行。检查which(dt$v1 == max(dt$v1))which(dt$v2 == max(dt$v2)) 以识别具有最大值的行。尝试从&amp; 更改为| 以获得结果。
  • @KarthikArumugham 是对的。你这样做的方法很好。如果你真的想一步到位,试试dt[,.SD[v1==max(v1) &amp; v2==max(v2*(v1==max(v1)))],by=names]
  • @KarthikArumugham 谢谢你的解释

标签: r data.table


【解决方案1】:

我们也可以用这个紧凑的

setDT(dt)[order(names, -v2),  head(.SD[v1==max(v1)], 1), by = names]
#   names v1 v2
#1:     a 11  5
#2:     b  9  7
#3:     c  7  9

或者正如@Frank 提到的,我们可以同时按'v1'和'v2'排序,并使用unique获取第一个元素

unique(setDT(dt)[order(-v1, -v2)], by="names")

【讨论】:

  • @Frank 是的,这很好。我应该有ordered
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2020-08-04
  • 2017-02-16
  • 1970-01-01
相关资源
最近更新 更多