如何通过data.table过滤多列中具有最大值(大于1)的行

时间:2017-03-05 06:53:58

标签: r data.table

我有一个像这样的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]

它抛出&#34;清空3个cols的data.table(0行):names,v1,v2。&#34;我不知道为什么,任何人都可以启发我?

1 个答案:

答案 0 :(得分: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")