R累计和转移

时间:2014-09-17 13:06:06

标签: r sum

数据具有随时间推移的正值,按单位分组。然后将求和的值转移到剩余的行。正值仅在imds行上。总和值需要转移到maint行。如果一个单元首先出现maint行,则总和值应为零。两个底部图表应显示增加的功能。

set.seed(2)
nrowsToShow=40
df<-data.frame(time=seq.Date( as.Date("2014/01/01"), length=100, by='1 days' ),
      source=sample(c("imds","maint"),100,replace=T), 
      unit=sample(101:110, 100,replace=T))
nimds=length(df$source[df$source=="imds"])
df$ft=NA
df$ft[df$source=="imds"]=sample(seq(0.5,5,.5),nimds,replace=T)
df<-df[with(df,order(unit,time)),]
head(df,nrowsToShow)
library(zoo)
na_replace <- function(x) {
  na.locf(x,na.rm=FALSE)
}
df$cum_ft=NA
df$cum_ft[df$source=="imds"] <- ave(df$ft[df$source=="imds"], df$unit[df$source=="imds"], FUN=cumsum)
# df$cum_ft <- ave(df$ft, df$unit, FUN=na_replace)
df$cum_ft <- ave(df$cum_ft, df$unit, FUN=na_replace)
df$cum_ft[is.na(df$cum_ft)]=0
head(df,nrowsToShow)
library(ggplot2)
x11()
p0<-ggplot(df[df$source=="imds",],aes(x=time,y=ft,group=unit))+geom_line(col=df$unit[df$source=="imds"])+
    labs(title="IMDS Data") + geom_point(col=df$unit[df$source=="imds"])
p1<-ggplot(df[df$source=="imds",],aes(x=time,y=cum_ft,group=unit))+geom_line(col=df$unit[df$source=="imds"])+
    labs(title="IMDS Data, Sum of data above") + geom_point(col=df$unit[df$source=="imds"])
p2<-ggplot(df,aes(x=time,y=cum_ft,group=unit))+geom_line(col=df$unit)+
    labs(title="ALL Data, value hold on data above") + geom_point(col=df$unit)
library(gridExtra)
plot_list=list(p0,p1,p2)
do.call(grid.arrange,plot_list)

没关系,&#34;错误&#34;找到并更新,上面的代码产生预期的结果。

1 个答案:

答案 0 :(得分:0)

在ave命令中有一个拼写错误,原始的和更正的都在上面的代码中。