在r中,分配先前的非na值

时间:2014-09-02 18:37:21

标签: r zoo na

我需要填写NA值,即用最后一个非NA值替换NA。这是一个例子,但最后一行没有填写。我得到一个错误,即要替换的值的数量不同于替换值的数量。我做错了什么?

# Test time accumulation and assignment
foo_df <- NULL
nTimes = 10000
nEvents = 70
nUnits = 300
usageTimes = seq(0.5, 3, .5)
events = c("File Event", paste("Event ",seq(1,nEvents)))
randDates <- function(N, st="2014/01/01", et="2014/07/31") {
     st <- as.POSIXct(as.Date(st))
     et <- as.POSIXct(as.Date(et))
     dt <- as.numeric(difftime(et,st,unit="sec"))
     ev <- sort(runif(N, 0, dt))
     rt <- st + ev
}
probEvent = rep(1, length(events))
probEvent[1] = 5
# Generate fake data with events, units, and event times
foo_df = data.frame(eventName = sample(events, nTimes, replace=T, probEvent),
   unit = sample(seq(1,nUnits),nTimes,replace=T),
   event_time= randDates(nTimes),
   usageTime = NA, cumTime=NA)
# Order by time, and set the first nUnits events to File Event for each unit
foo_df = foo_df[with(foo_df, order(event_time)), ]
foo_df[1:nUnits ]$eventName = "File Event"
foo_df[1:nUnits ]$unit = seq(1,nUnits)
# Add random usage times to File Events
nFile = length(foo_df$eventName[foo_df$eventName == "File Event"])
foo_df$usageTime[foo_df$eventName == "File Event"] = sample(usageTimes, nFile, replace=T)
# Order by unit / event time
foo_df = foo_df[with(foo_df, order(unit,event_time)), ]

# accumulate the event time for file events
entire_file_rows = foo_df$eventName=="File Event"
temp_df = data.frame(cum_ft=0, event_time=foo_df$event_time[entire_file_rows],
      unit=foo_df$unit[entire_file_rows], usageTime=foo_df$usageTime[entire_file_rows])
temp_df$cumTime <- ave(temp_df$usageTime, temp_df$unit, FUN=cumsum) 
foo_df$cumTime[entire_file_rows] = temp_df$cumTime

# This is where I'm stuck
# Want to assign the cummulative time to the other events (non File Event)

library(zoo) ; 
# foo_df[foo_df$eventType != "File Event"]$"cumTime" <- NA 
foo_df$cumTime <- na.locf(foo_df$cumTime)

我收到错误消息:&#34; $<-.data.frame中的错误(*tmp*,&#34; cumTime&#34;,值= c(2.5,2.5,4,4,:   替换有9993行,数据有10000&#34;

我可以看到有两个问题,首先是NA首先发生,所以它们不能从na.locf中携带,其次,locf应该在单元上进行分组。

但是,为什么NA​​首先出现?根据EventTime对数据进行排序,然后为第一个nUnit记录分配单元号1到nUnit,以及eventName&#34; File Event&#34;。以后,当按单位和eventTime排序时,有时候会出现&#34;文件事件&#34;记录?

此过程应该在cumTime中累计使用时间,记录按单位排序,然后按EventTime排序。在从&#34;文件事件&#34;转移cumTIme之前对于其他事件,我绘制了按单位和事件类型与eventTime分组的cumTime,并且该情节看起来没问题,cumTime正在增加。但是,在转移了&#34;文件事件&#34;对于其他事件,然后cumTime(按单位/事件类型分组)与eventTime的关系不正确,因为cumTime有峰值和逐渐递减的值,这是不可能的。

2 个答案:

答案 0 :(得分:4)

您有NA个值的问题。默认情况下会在na.locf中删除这些内容,从而导致分配右侧的向量较短。

您可以指定前导NA&#39;

foo_df$cumTime <- na.locf(foo_df$cumTime, na.rm=FALSE)

这将覆盖除前导值之外的每个NA值。

然后,您可以将前导NA值分配给其他内容:

foo_df$cumTime[is.na(foo_df$cumTime)] <- 0

答案 1 :(得分:0)

错误位于将“文件事件”和单元分配给第一个nUnits记录的行中。正确的行是

foo_df$eventName[1:nUnits ] = "File Event"
foo_df$unit[1:nUnits ] = seq(1,nUnits)

然后,没有使用时间的第一行没有问题,命令na.locf(foo_df $ cumTime)生成正确的记录数。