→ cywhale: mutate(grp=1+as.integer(round-1)/30) 02/22 08:51
抱歉我可能描述的不夠清楚
我總共有3000個回合的資料,每個回合產生的y筆數為1-6筆不等
我想要做的是取第1到第30回合(round欄位為1到30者)當第1組
第31到60回合為第2組,第61到90回合為第3組...第2971-3000回合為第100組
去計算各組裡面y的平均
所以預期結果是要產生"100筆"分組的平均資料
cywhale大大感謝您的回覆,我試過您的作法,可是結果還是不太對>"<
照您的做法產生的是3000筆平均(ie.每個回合內y的平均)
※ 編輯: locka (118.160.8.213), 02/22/2017 15:42:28
1600 update: hi,我現在試出一個做法如下:
lapply(seq(1,3000,100),function(start){
end <- start+30
mydt <- filter(round %in% c(start,end)) %>% summarise(mean(y))
}) %>% unlist(use.names=F)
變成計算先要取的round是幾到幾,然後從原資料filter出來後計算平均,
最後再unlist
感覺有點蠢QQ
總覺得應該有data.table的寫法
請大家指教>"<
※ 編輯: locka (118.160.8.213), 02/22/2017 16:10:37
推 cywhale: 我覺得我說的沒錯?先產生group(如上回覆)再去組內平均 02/22 16:14
→ cywhale: DT[,grp:=rp=1+as.integer(round-1)/30] %>% .[,mean(y), 02/22 16:15
→ cywhale: by=grp] 就是做組內平均,dplyr用mutate接著根據grp平均 02/22 16:17
可是執行as.integer(round-1)/30 不是把round除30嗎?(先不考慮前面的+1)
這樣商會有0,0.033,0.066,1,1.33...一直到最後一個值是1
商只會越來越大, 總共會有3000組商
那這樣這樣的分組結果跟單純用round分組是一樣的不是嗎?
我要的不是依照round分組 是想要每30 round分一組而且要照順序
參考您的作法
我有試過as.integer(round-1)%%100 用取餘數的方法分成100組
可是這樣的話就會變成第一組是(1,101,201,301,...2901)這些回合的平均
第二組是(2,201,202,302...2902)...
雖然每組也是30個round但不是我想要的(1,2,3...30),(31,32,33,34..60),
(2971,2972,2973,...3000)...
※ 編輯: locka (118.160.8.213), 02/22/2017 16:32:25
推 cywhale: 我沒注意到我括號打錯位置..1+as.integer((round-1)/30) 02/22 17:20
噢噢!!我看懂了!!無條件捨棄小數點,直接依照整數部分來分組
這方法要學起來...(筆記)
那這樣就沒錯了,十分感謝cywhale大大,thanks!!
※ 編輯: locka (118.160.8.213), 02/22/2017 17:55:19
→ celestialgod: findInterval(1:3000, seq(1, 3000, by = 30)) 02/22 20:08
→ celestialgod: 分群可以用上面指令 02/22 20:08