Re: [问题] 移动平均的开头和结尾处理

楼主: celestialgod (天)   2018-01-17 20:43:54
※ 引述《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]
作者: giock18 (小武)   2018-01-18 14:02:00
太强了!这的确就是我所需要的,感谢c大!!!!!关键在于前后增列,而且版大让过成变得很简洁!

Links booklink

Contact Us: admin [ a t ] ucptt.com