作者celestialgod (天)
看板R_Language
标题Re: [问题] 移动平均的开头和结尾处理
时间Wed Jan 17 20:43:54 2018
※ 引述《giock18 (小武)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: 使用者
: [问题叙述]:
: 遇到一个问题卡关想请教版上大大
: 我有一笔资料,必须依ID分组处理
: 在每组当中,针对每小时的资料,必须往前、往後做移动平均
: 范例:
: Test<-data.frame(hrs=seq(from=0,to=23),TaxiTime=runif(24,min=15,max=25))
: Test$ID<-'a'
: Test2<-Test
: Test2$ID<-'b'
: Test <- rbind(Test,Test2)
: df1 <- group_by(Test,ID) %>%
: mutate(TaxiTime2 = lead(TaxiTime, 1), TaxiTime3 = lag(TaxiTime, 1)) %>%
: filter(!is.na(TaxiTime) | !is.na(TaxiTime2) | !is.na(TaxiTime3))
: %>%data.frame()
: print(df1)
: #在这里可以看出,这个做法还没考虑到,遇到00点和23点的时候的问题
: df2 <-mutate(df1, TaxiTime.Mean = rowMeans(select(df1,
: starts_with("TaxiTime")), na.rm = TRUE))
: 但遇到一个问题是,如果是分组的第一列资料(00点的时候),该如何让他去取23点的资料
: 去补TaxiTime2 的空值。
: 同理,遇到最後一列资料(23点的时候)该如何让他去取00点的资料补值。
: 这样的功能有点像移动平均的头尾问题,所以我问题这样取名,
: 如果有更好的问题命名建议我可以修正!!拜托大大了!
: [关键字]:
: moving average,分组处理
library(zoo)
library(data.table)
library(pipeR
# 资料生成
DT <- data.table(hr = rep(0:23, 2), id = rep(letters[1:2], each = 24),
taxiTime = runif(48, 15, 25))
# pipe版本 (no temporary variables)
out <- DT[hr %in% c(0, 23)] %>>% # 先取出头尾
`[`(hr == 23, hr := -1) %>>% # 让尾巴变头
`[`(hr == 0, hr := 24) %>>% # 让头变尾巴
rbind(DT) %>>% setorder(id, hr) %>>% # 跟原本资料合并後排序
`[`(j = mvAvg := rollapply(taxiTime, 3, mean, fill = NA), by = .(id)) %>>%
# 取moving average
`[`(hr >= 0 & hr <= 23) # 移除刚刚新增的列
# 或是不用pipe的版本:
tmp <- DT[hr %in% c(0, 23)]
tmp[hr == 23, hr := -1]
tmp[hr == 0, hr := 24]
DT2 <- rbind(tmp, DT)
setorder(DT2, id, hr)
out <- DT2[ , mvAvg := rollapply(taxiTime, 3, mean, fill = NA),
by = .(id)][hr >= 0 & hr <= 23]
--
R资料整理套件系列文:
magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9
data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue
dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b
tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz
pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.235.47.214
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1516193038.A.D3A.html
※ 编辑: celestialgod (36.235.47.214), 01/17/2018 20:57:22
1F:推 giock18: 太强了!这的确就是我所需要的,感谢c大!!!!! 01/18 14:02
2F:→ giock18: 关键在於前後增列,而且版大让过成变得很简洁! 01/18 14:03