假设我有一个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中的mvtnorm包中出现这个错误?

使用R中的小鼠()进行插补后观察次数显着变化

R -列表元素中所有命名项的总和

是否有R函数来判断一个组中的所有值是否与另一个组中的所有值相同?

用单个表达匹配多个替代模式

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

bslib::card_header中的shine::downloadButton,图标而不是文本

在df中保留原始变量和新变量

根据元素和前一个值之间的差值过滤矩阵的元素

R Select()可以测试不存在的子集列

R如何计算现有行的总和以添加新的数据行

在数据帧列表上绘制GGPUP

R如何将列名转换为更好的年和月格式

如何将一列中的值拆分到R中各自的列中

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

仅当后续值与特定值匹配时,才在列中回填Nas

在不对R中的变量分组的情况下取两行的平均值

从线的交点创建面

按组使用dummy r获取高于标准的行的平均值

如果满足条件,则替换列的前一个值和后续值