如何将列中的最后一个值附加到R中的所有NA?

时间:2014-07-18 17:42:01

标签: r

数据框

my.df <- data.frame(Vehid = rep(c(2,3), each=25), frameid = rep(c(1:25), 2), roll.corr = rep(c(rep(0.3,3), 0.4,0.6, rep(0.7,12), 0.6,0.5,0.5,0.4, rep(NA,4)),2),
                    framestart = rep(c(1:21, rep(NA, 4)),2), frameend = rep(c(5:25, rep(NA,4)),2))

必需

对于vehid我希望获得NA之前的最后一个值,例如在这种情况下为0.4,并用该值替换所有NA

我尝试了什么

如果数据框只有1 vehid,则后续工作:

my.df$roll.corr[is.na(my.df$roll.corr)] <- my.df$roll.corr[head(which(match(my.df$roll.corr, NA)==1),1)-1]

必须有一个简单的方法来做到这一点,但我只能在上面做。现在,对于多个vehid我尝试使用ddply后将上面定义为函数如下,但它没有工作:

my.func <- function(b){
  b[is.na(b)] = b[head(which(match(b,NA)==1),1)-1]
}

ddply(my.df, .(Vehid), my.func(roll.corr))

它给出了object roll.corr not found

的错误

期望输出

my.df <- data.frame(Vehid = rep(c(2,3), each=25), frameid = rep(c(1:25), 2), roll.corr = rep(c(rep(0.3,3), 0.4,0.6, rep(0.7,12), 0.6,0.5,0.5,0.4, rep(0.4,4)),2),
                    framestart = rep(c(1:21, rep(NA, 4)),2), frameend = rep(c(5:25, rep(NA,4)),2))

请提出一个简单的解决方案。

1 个答案:

答案 0 :(得分:0)

最直接的方法可能是使用“zoo”包中的na.locf

您应该可以执行以下操作:

library(zoo)
na.locf(my.df$roll.corr)
#  [1] 0.3 0.3 0.3 0.4 0.6 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7
# [17] 0.7 0.6 0.5 0.5 0.4 0.4 0.4 0.4 0.4 0.3 0.3 0.3 0.4 0.6 0.7 0.7
# [33] 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.6 0.5 0.5 0.4 0.4 0.4
# [49] 0.4 0.4