【问题标题】:R data.table count panel dataR data.table 计数面板数据
【发布时间】:2013-09-05 20:13:42
【问题描述】:

我有面板数据(主题/年份),我希望只保留每年出现最多次数的主题。数据集很大,所以我使用的是 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

【问题讨论】:

  • 所以基本上你想要一个data.table,其中包含每个披头士乐队数据最丰富年份的所有数据?
  • 想一想,如果data.tablei 表达式中具有与在j 表达式中相同的by 功能,那就太好了。

标签: r count data.table


【解决方案1】:

我不确定您是否会认为这是优雅,但如何:

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

这基本上就是如何将by 应用于@SenorO 评论的i 表达式。之后您仍然需要[,COUNT:=NULL],但需要一个临时列而不是两个。

虽然出于速度原因,我们不鼓励 .SD,但希望我们能尽快处理此功能请求,以便可以放弃建议:FR#2330 Optimize .SD[i] query to keep the elegance but make it faster unchanged.

另一种方法如下。它更快、更习惯,但可能被认为不太优雅。

# 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]

类似的东西是here

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2021-04-30
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多