看板 R_Language 關於我們 聯絡資訊
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