假设我有一个data.table,里面有一些棒球运动员:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)

对于每个组(由玩家"id"给出),我想 Select 与最大游戏数"g"对应的行.这在plyr中很简单:

ddply(baseball, "id", subset, g == max(g))

data.table的等效代码是多少?

我试过:

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%,这表明它可能不是惯用语.

推荐答案

以下是快速data.table路:

bdt[bdt[, .I[g == max(g)], by = id]$V1]

这避免了构造.SD,这是表达式中的瓶颈.

edit:实际上,OP速度慢的主要原因不仅在于它有.SD个,还在于它以一种特殊的方式使用它——通过调用[.data.table,它目前有巨大的开销,因此在循环中运行它(当一个人执行by时)会累积非常大的惩罚.

R相关问答推荐

R中的滞后累积量

使用map()内的公式()创建多个公式

R通过字符串中的索引连接数据帧r

r中的stat_difference函数不起作用

手动打印线型gplot

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

错误:非常长的R行中出现意外符号

制作等距离的线串副本

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

线性模型斜率在减少原始数据时提供NA

用约翰逊分布进行均值比较

计算两列中满足特定条件连续行之间的平均值

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

按时间顺序对不同事件进行分组

R -在先前group_by级别汇总时获取最大大小子组的计数

基于Key->Value数据帧的基因子集相关性提取

将标识符赋给事件序列,避免错误观察

计算使一组输入值最小化的a、b和c的值

按组和连续id计算日期差

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容