Re: [問題] 在dataframe中抓取前n筆的值做平均

作者: celestialgod (天)   2017-12-20 23:07:21
※ 引述《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
作者: cywhale (cywhale)   2017-12-20 23:21:00
剛推錯篇冏..也可以用shiftdt[,z:=cumsum(shift(value,1,0))/3, by=group]
作者: menghsuanliu (庫庫少)   2017-12-21 11:12:00
感謝,感覺shift比較好用

Links booklink

Contact Us: admin [ a t ] ucptt.com