2017-02-21 44 views
2

的累積和假設在R I有以下的數據幀dat計算等式

a <- c(6,6,6,7,9,10,11,13,16,17,19,20,22,10,23,25,32,32,34,35,6) 
b <- c(1,1,0,1,0,1,0,1,1,0,0,0,1,0,1,0,0,0,0,0,1) 
q <- c(3,2,4,2,4,2,2,3,0,5,0,6,1,0,3,4,9,1,2,0,12) 

dat <- data.frame(a, b, q) 
dat <- dat[order(dat$a),] 

對於a每個級別,我必須計算f = with(dat, sum(q[a==that level]*b[a==that level])/sum(b[a==that level]))。例如,對於​​,f=(3*1+2*1+4*0+12*1)/(3+2+4+12)=17/21

所以我寫的代碼如下:

dat$qb <- dat$q * dat$b 

v1 <- as.numeric(by(dat$qb, dat$a, FUN=sum)) 
dat$sqb <- rep(v1, table(dat$a)) 

v2<-as.numeric(by(dat$q, dat$a, FUN=sum)) 
dat$sumq <- rep(v2, table(dat$a)) 

dat$f <- dat$sqb/dat$sumq 

現在我只需要列af

dat <- unique(dat[,c(1,7)]) 

我的下一步是計算公式f = with(dat, sum(q[a==that level]*b[a==that level])/sum(b[a==that level]))的累積和:

dat <- replace(dat, is.na(dat), 0) 
dat$F <- cumsum(dat$f) 

最終,我ne版的F爲其a<=18最大值:

Ft <- max(dat$F[dat$a<=18]) 

這是一個模擬的一部分,並且該部分的目標是找到的​​值。我認爲有更快的方法來編寫這些代碼塊。

  • 任何更快的R代碼塊計算Ft將不勝感激。

回答

2

我們可以通過「A」使用tidyverse到組,用「Q」乘以「B」計算「F」,獲得由「Q」的sumsum和鴻溝。用0.1N

library(tidyverse) 
dat1 <- dat %>% 
      group_by(a) %>% 
      summarise(f = sum(b*q)/sum(q)) %>% 
      mutate(F = cumsum(replace(f, is.na(f), 0))) 

過濾replace荷蘭國際集團NA之後創建「F」爲「F」的cumsum其中「a」是小於或等於18的行中,提取「F」的列,並獲得max

dat1 %>% 
    filter(a <= 18) %>% 
    .$F %>% 
    max 
#[1] 3.809524 

或者另一種選擇是data.table

library(data.table) 
setDT(dat)[, .(f= sum(b*q)/sum(q)) , a][is.na(f), f := 0 
      ][, F := cumsum(f)][a <= 18, max(F)] 
#[1] 3.809524