我有一个像这样的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;我不知道为什么,任何人都可以启发我?
答案 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")