相关疑难解决方法(0)

使用data.table按组进行子集化

假设我有一个包含一些棒球运动员的数据表:

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

r greatest-n-per-group data.table

51
推荐指数
1
解决办法
2万
查看次数

如何提取每组前n行?

我有一个data.table dt.此data.table首先按列date(我的分组变量)排序,然后按列排序age:

library(data.table)
setkeyv(dt, c("date", "age")) # Sorts table first by column "date" then by "age"
> dt
         date age     name
1: 2000-01-01   3   Andrew
2: 2000-01-01   4      Ben
3: 2000-01-01   5  Charlie
4: 2000-01-02   6     Adam
5: 2000-01-02   7      Bob
6: 2000-01-02   8 Campbell
Run Code Online (Sandbox Code Playgroud)

我的问题是:我想知道是否可以为每个唯一日期提取前两行?或更一般地说:

如何提取每组中的前n行

在此示例中,结果dt.f将是:

> dt.f = ???????? # function of dt to extract the first 2 rows per unique date
> dt.f
         date age   name
1: 2000-01-01 …
Run Code Online (Sandbox Code Playgroud)

r data.table

27
推荐指数
2
解决办法
3498
查看次数

如何使用该子集提取前n行并计算每组的函数,然后通过不同的组计算平均值?

这是我之前的问题的后续问题: 如何提取每组前n行并使用该子集计算函数?

另一篇相关文章:如何提取每组前n行?

我有以下数据:

set.seed(1)
dt1 <- data.table(ticker="aa",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
dt2 <- data.table(ticker="aapl",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
dt3 <- data.table(ticker="abc",letters=sample(LETTERS,10^6,T),x=rnorm(2000,100,10),y=rnorm(2000,80,20))
myList <- list(dt1,dt2,dt3)
Run Code Online (Sandbox Code Playgroud)

我想在一个特定的索引上按函数输出取决于子集化的数据帧,对这个数据应用一个函数.然后,我想用不同的分组变量对结果data.table进行分组,并采用简单的方法.

我想首先通过group1在子集化行上计算我的函数,rbindlist结果,然后通过group2计算平均值?

或者我想首先对我的整个数据进行rbindlist,预先选择子集行,然后通过group1计算我的函数然后按group2计算均值?

# data.table version of function
dt_calc_perf <- function(dt){
  buy <- ifelse(dt$x > mean(dt$y),1,0)
  dt$perf <- buy*(dt$x/dt$y-1)
  return(dt)
}
# vector return version of function
calc_perf <- function(dt){
  buy <- ifelse(dt$x > mean(dt$y),1,0)
  perf <- buy*(dt$x/dt$y-1)
  return(perf)
}

# which is faster?

# method 1
method1 <- function(){
  res1 <- rbindlist(lapply(1:length(myList), 
                           function(m) dt_calc_perf(myList[[m]][1:1000])))
  res1 <- res1[,list('perf'=mean(perf),'tickers'=paste(ticker,collapse=',')),
               by=letters]
}

# method …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
243
查看次数

标签 统计

data.table ×3

r ×3

greatest-n-per-group ×1