我有一个data.frame,其中包含以下向量:NAME,JUMP.NUMBER,POWER。这些变量是通过从1到20重复跳跃来获得的。
我想确定每个主题1到20次跳转的POWER的最佳滚动方式,然后创建一个包含这些值的新data.frame。
虽然我需要很长时间,但我可以通过“NAME'”对数据进行子集,使用动物园中的rollmean()
函数计算滚动方式,从每个新数据中查找最大值.frames,然后使用这些值创建一个新的data.set。然而,这非常缓慢。
我的代码如下所示:
sample<-subset(JUMP.DATA, NAME=="Bob")
ROLLING1<-rollmean(sample,1)
ROLLING2<-rollmean(sample,2)
ROLLING3<-rollmean(sample,3)
ROLLING4<-rollmean(sample,4)
MAXROLLING4<- max(ROLLING4)
MAXROLLING1<- max(ROLLING1)
MAXROLLING2<- max(ROLLING2)
MAXROLLING3<- max(ROLLING3)
NUMBER=c(1, 2, 3, 4)
ROLLING.POWER=c(MAXROLLING1, MAXROLLING2, MAXROLLING3, MAXROLLING4)
BEST.ROLLING.MEAN <-cbind(NUMBER, ROLLING.POWER)
我确信有一种更直接的方法来计算滚动平均值〜组。任何帮助将不胜感激。
原始data.set看起来像这样:
NAME=c(Bob, Bob, Bob, Bob, John, John, John, John)
JUMP.NUMBER= c(1, 2, 3, 4, 1, 2, 3, 4)
POWER = c(3000, 2800, 2700, 2600, 3400, 3100, 2900, 2800)
JUMP.DATA= cbind(NAME, JUMP.NUMBER, POWER)
答案 0 :(得分:2)
这是一个data.table解决方案。
library(data.table)
library(zoo)
get.power <- function(p)sapply(1:length(p),function(k)max(rollmean(p,k)))
setDT(JUMP.DATA)[,ROLLING.POWER:=get.power(POWER),by=NAME]
JUMP.DATA
NAME JUMP.NUMBER POWER ROLLING.POWER
1: Bob 1 3000 3000.000
2: Bob 2 2800 2900.000
3: Bob 3 2700 2833.333
4: Bob 4 2600 2775.000
5: John 1 3400 3400.000
6: John 2 3100 3250.000
7: John 3 2900 3133.333
8: John 4 2800 3050.000
回复@ Arun的评论
所以这是一个基准,将runmean(...)
中的caTools
与rollmean(...)
中的zoo
进行比较。前者快4倍左右。请注意,默认值不同。
# 26 names, each with 20 jumps
set.seed(1) # for reproducibility
JUMP.DATA <- data.frame(NAME=rep(LETTERS,each=20),
JUMP.NUMBER=1:20,
POWER=100*rpois(20*26,10))
DT1 <- as.data.table(JUMP.DATA)
DT2 <- as.data.table(JUMP.DATA)
gp.zoo <- function(p)sapply(1:length(p),function(k)max(rollmean(p,k)))
gp.caTools <- function(p)sapply(1:length(p),function(k)max(runmean(p,k,endrule="trim")))
f.zoo <- function() DT1[,ROLLING.POWER:=gp.zoo(POWER),by=NAME]
f.caTools <- function() DT2[,ROLLING.POWER:=gp.caTools(POWER),by=NAME]
library(microbenchmark)
microbenchmark(f.zoo(),f.caTools(),times=10)
# Unit: milliseconds
# expr min lq median uq max neval
# f.zoo() 423.6837 427.5221 433.4347 435.8686 469.825 10
# f.caTools() 102.6002 107.1747 108.7353 109.3258 111.931 10
identical(DT1,DT2)
# [1] TRUE
答案 1 :(得分:0)
我不太清楚你在这里寻找什么,但这似乎是对dplyr包的好用。
您可以使用以下方法计算特定组的滚动平均值,其中JUMP.DATA是您的数据集,NAME是您要分组的变量。这将为您的数据框添加一个新列(我已将其重命名为“xx”,以便不编辑原始列),称为“ROLLING”:
xx <- group_by(JUMP.DATA,NAME) %>% mutate(ROLLING=rollmean(POWER))
如果您想在每个组中找到最大滚动平均值,则可以使用摘要,这将为每个组提供单个值。
my.summary <- group_by(xx,NAME) %>% summarise(MY.MAX=max(ROLLING))