假设我有一个包含一些棒球运动员的数据表:
library(plyr)
library(data.table)
bdt <- as.data.table(baseball)
Run Code Online (Sandbox Code Playgroud)
对于每个玩家(由id给出),我想找到与他们玩最多游戏的年份相对应的行.这在plyr中很简单:
ddply(baseball, "id", subset, g == max(g))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这有效:
bdt[, .SD[g == max(g)], by = id]
Run Code Online (Sandbox Code Playgroud)
但它比plyr快30%,这表明它可能不是惯用语.
如何根据data.table中的条件删除/保留组?有没有比添加新列更好的方法,然后过滤该列并将其删除?
set.seed(0)
dt <- data.table(a = rep(1:3, rep(3, 3)), b = sample(1:5, 9, T))
# a b
# 1: 1 4
# 2: 1 1
# 3: 1 2
# 4: 2 1
# 5: 2 4
# 6: 2 2
# 7: 3 4
# 8: 3 3
# 9: 3 4
#data.table
dt[, keep := 2 %in% b, by = a][keep == T][, keep := NULL][]
# a b
# 1: 1 5
# 2: 1 2
# …Run Code Online (Sandbox Code Playgroud)