问题 R data.table计数面板数据


我有面板数据(科目/年份),我想只保留每年出现最多次数的科目。数据集很大,所以我使用的是data.table包。有没有比我在下面尝试过的更优雅的解决方案?

library(data.table)

DT <- data.table(SUBJECT=c(rep('John',3), rep('Paul',2), 
                           rep('George',3), rep('Ringo',2), 
                           rep('John',2), rep('Paul',4), 
                           rep('George',2), rep('Ringo',4)), 
                 YEAR=c(rep(2011,10), rep(2012,12)), 
                 HEIGHT=rnorm(22), 
                 WEIGHT=rnorm(22))
DT

DT[, COUNT := .N, by='SUBJECT,YEAR']
DT[, MAXCOUNT := max(COUNT), by='YEAR']

DT <- DT[COUNT==MAXCOUNT]
DT <- DT[, c('COUNT','MAXCOUNT') := NULL]
DT

3956
2017-09-05 20:13


起源

所以基本上你需要一个data.table,其中包含每个披头士乐队数据最丰富的年份的所有数据? - Señor O
想想看,它会很好 data.table 有一些相同的 by 能力 i 像它一样表达 j 表达式。 - Señor O


答案:


我不确定你会不会这样看 优雅 但怎么样:

DT[, COUNT := .N, by='SUBJECT,YEAR']
DT[, .SD[COUNT == max(COUNT)], by='YEAR']

这基本上就是如何申请 by 到了 i 表达为@SenorO评论。你还需要 [,COUNT:=NULL] 之后但是一个临时列而不是两个。

我们劝阻 .SD 虽然出于速度原因,但希望我们很快就会得到这个功能请求,以便可以删除建议: FR#2330优化.SD [i]查询以保持优雅但更快更快。

不同的方法如下。它更快更惯用,但可能被认为不那么优雅。

# Create a small aggregate table first. No need to use := on the big table.
i = DT[, .N, by='SUBJECT,YEAR']

# Find the even smaller subset. (Do as much as we can on the small aggregate.)
i = i[, .SD[N==max(N)], by=YEAR]

# Finally join the small subset of key values to the big table
setkey(DT, YEAR, SUBJECT)
DT[i]

类似的东西是 这里


14
2017-09-05 22:13