R 使用data.table按组将对应于最大值的行子集
假设我有一个R 使用data.table按组将对应于最大值的行子集,r,data.table,greatest-n-per-group,R,Data.table,Greatest N Per Group,假设我有一个数据。表包含一些棒球运动员: library(plyr) library(data.table) bdt <- as.data.table(baseball) 数据表的等效代码是什么 我试过: setkey(bdt, "id") bdt[g == max(g)] # only one row bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j bdt[,
数据。表包含一些棒球运动员:
library(plyr)
library(data.table)
bdt <- as.data.table(baseball)
数据表的等效代码是什么
我试过:
setkey(bdt, "id")
bdt[g == max(g)] # only one row
bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j
bdt[, .SD[g == max(g)]] # only one row
这项工作:
bdt[, .SD[g == max(g)], by = id]
但它只比plyr快30%,这表明它可能不是惯用的方法。以下是fast数据。表
方式:
bdt[bdt[, .I[g == max(g)], by = id]$V1]
这避免了构建.SD
,这是表达式中的瓶颈
编辑:实际上,OP速度慢的主要原因不仅仅是它里面有.SD
,而是它以一种特殊的方式使用它——通过调用[.data.table
,它目前有巨大的开销,所以在循环中运行它(当一个人通过执行时)累积一个非常大的惩罚。哇,这很慢,但是如果你用“年”代替“.SD”…我每年分别获得.01、1.58、2.39用户时间,.SD、plyr。@Frank,但我想要整个数据帧,而不仅仅是一年。我会澄清这个问题。+1我打赌Hadley希望以编程的方式实现这一点,在这种情况下,他希望使用以下语法,bdt[bdt[,.I[g==max(g)],by=id][,V1]]
对吗?@joran我正在手动构造调用,因此它实际上并不重要,原始方法将被优化。请参阅优化.SD[I]
query以保持优雅,但使其速度保持不变。这个问题链接从R-Forge移到GitHub后,如果我在内部框架中添加verbose=TRUE
,我会看到GForce FALSE
,但它仍然比类似于bdt[bdt[,(g=max(g)),by=id],on=c(“id”,“g”)]
,但我不知道是否总是这样。
bdt[bdt[, .I[g == max(g)], by = id]$V1]