作者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://www.ptt.cc/bbs/R_Language/M.1513783873.A.820.html
→ tan800630: 正在po文時被celestialgod大先超前了QQ 12/20 23:32
→ menghsuanliu: 謝謝你的答案 12/21 11:13