作者tan800630 (天ㄦ)
看板R_Language
标题Re: [问题] 在dataframe中抓取前n笔的值做平均
时间Wed Dec 20 23:31:10 2017
code有点难看,套件也是因为手顺所以用了一点dplyr
(其实只要用自己习惯的资料整理套件应该都可)
主要是先做一个函数可以在输入特定array 与 要往前平均几笔的"n" 之後
产生我们想要的那个平均(用ifelse做得好丑)
之後用apply系列处理掉
感觉应该有很大的进步空间
再请各位大大指教O_Q
--------------------------------------------------------
library(dplyr)
library(data.table)
dat=data.frame(group=c("A","A","A","A","B","B","B","B"),
value=c(10,15,12,30,11,20,25,22))
n=3
func=function(value,n){
sapply(c(1:length(value)),function(i){
cur_value=value[ifelse(i-n>0,i-n,0):ifelse(i-1>0,i-1,0)]
sum(cur_value)/ifelse(length(cur_value)>0,n,0)})
}
#这行输出後即是整理过後的资料
lapply(unique(dat$group),function(g){
dat %>% filter(group==g) %>% mutate(avg=func(value,n))
}) %>% rbindlist()
※ 引述《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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.246.30.71
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1513783873.A.820.html
1F:→ tan800630: 正在po文时被celestialgod大先超前了QQ 12/20 23:32
2F:→ menghsuanliu: 谢谢你的答案 12/21 11:13