【发布时间】: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。”不知道为什么,有大神能指教一下吗?
【问题讨论】:
-
这是因为两个列的最大值行不同。由于顺序子集,第一个代码通过返回子集中的最大值来工作。由于
&,第二个代码没有返回匹配的行。检查which(dt$v1 == max(dt$v1))和which(dt$v2 == max(dt$v2))以识别具有最大值的行。尝试从&更改为|以获得结果。 -
@KarthikArumugham 是对的。你这样做的方法很好。如果你真的想一步到位,试试
dt[,.SD[v1==max(v1) & v2==max(v2*(v1==max(v1)))],by=names]。 -
@KarthikArumugham 谢谢你的解释
标签: r data.table