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