看板 R_Language 關於我們 聯絡資訊
※ 引述《menghsuanliu (庫庫少)》之銘言: : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 我有一個Dataframe,以第一欄做group by, 第二欄的值做前三筆的平均,然後把值寫在第三欄 : [程式範例]: : dataframe (AS-IS) : group value : 1 AAA 10 : 2 AAA 15 : 3 AAA 12 : 4 AAA 30 : 5 AAA 11 : 6 BBB 20 : 7 BBB 25 : 8 BBB 22 : 9 BBB 17 : ....... : (TO-BE) : group value avg : 1 AAA 10 na : 2 AAA 15 3.33 10/3 : 3 AAA 12 8.33 (10+15)/3 : 4 AAA 30 12.33 (10+15+12)/3 : 5 BBB 11 na : 6 BBB 20 3.67 11/3 : 7 BBB 25 10.33 (11+20)/3 : 8 BBB 22 18.67 (11+20+25)/3 : 9 BBB 17 21.67 (20+25+22)/3 : [環境敘述]: : R 3.3.3 : R Studio 1.0.143 你的TO-BE資料跟AS-IS好像不太對XDDD DF <- read.table(textConnection("group value AAA 10 AAA 15 AAA 12 AAA 30 AAA 11 BBB 20 BBB 25 BBB 22 BBB 17"), header = TRUE) DF$avg <- do.call(c, tapply(DF$value, DF$group, function(x){ c(NA, cumsum(x[-length(x)]) / rep(3, length(x)-1)) })) # group value avg # 1 AAA 10 NA # 2 AAA 15 3.333333 # 3 AAA 12 8.333333 # 4 AAA 30 12.333333 # 5 AAA 11 22.333333 # 6 BBB 20 NA # 7 BBB 25 6.666667 # 8 BBB 22 15.000000 # 9 BBB 17 22.333333 library(data.table) DT <- DF setDT(DT) DT[ , avg := c(NA, cumsum(value[-length(value)]) / rep(3, length(value)-1)), by = .(group)] # group value avg # 1: AAA 10 NA # 2: AAA 15 3.333333 # 3: AAA 12 8.333333 # 4: AAA 30 12.333333 # 5: AAA 11 22.333333 # 6: BBB 20 NA # 7: BBB 25 6.666667 # 8: BBB 22 15.000000 # 9: BBB 17 22.333333 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.38.60 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1513782445.A.B76.html ※ 編輯: celestialgod (118.170.38.60), 12/20/2017 23:08:12
cywhale: 剛推錯篇冏..也可以用shift 12/20 23:21
cywhale: dt[,z:=cumsum(shift(value,1,0))/3, by=group] 12/20 23:21
感謝,學習到了一個新函數
menghsuanliu: 感謝,感覺shift比較好用 12/21 11:12
※ 編輯: celestialgod (118.170.38.60), 12/21/2017 22:39:09