Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用data.table按组将对应于最大值的行子集_R_Data.table_Greatest N Per Group - Fatal编程技术网

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]