data.frame(或data.table)中,我想用最接近的前一个非NA值"向前填充"NAs.下面是一个使用向量(而不是data.frame)的简单示例:

> y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)

我想要一个函数fill.NAs(),它允许我构造yy,这样:

> yy
[1] NA NA NA  2  2  2  2  3  3  3  4  4

我需要对许多(总计~1 Tb)小型data.frames(~30-50MB)重复此操作,其中一行是NA,所有条目都是NA.解决这个问题的好方法是什么?

我设计的丑陋解决方案使用了以下功能:

last <- function (x){
    x[length(x)]
}    

fill.NAs <- function(isNA){
if (isNA[1] == 1) {
    isNA[1:max({which(isNA==0)[1]-1},1)] <- 0 # first is NAs 
                                              # can't be forward filled
}
isNA.neg <- isNA.pos <- isNA.diff <- diff(isNA)
isNA.pos[isNA.diff < 0] <- 0
isNA.neg[isNA.diff > 0] <- 0
which.isNA.neg <- which(as.logical(isNA.neg))
if (length(which.isNA.neg)==0) return(NULL) # generates warnings later, but works
which.isNA.pos <- which(as.logical(isNA.pos))
which.isNA <- which(as.logical(isNA))
if (length(which.isNA.neg)==length(which.isNA.pos)){
    replacement <- rep(which.isNA.pos[2:length(which.isNA.neg)], 
                                which.isNA.neg[2:max(length(which.isNA.neg)-1,2)] - 
                                which.isNA.pos[1:max(length(which.isNA.neg)-1,1)])      
    replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
} else {
    replacement <- rep(which.isNA.pos[1:length(which.isNA.neg)], which.isNA.neg - which.isNA.pos[1:length(which.isNA.neg)])     
    replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
}
replacement
}

功能fill.NAs的使用如下:

y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
isNA <- as.numeric(is.na(y))
replacement <- fill.NAs(isNA)
if (length(replacement)){
which.isNA <- which(as.logical(isNA))
to.replace <- which.isNA[which(isNA==0)[1]:length(which.isNA)]
y[to.replace] <- y[replacement]
} 

100

> y
[1] NA  2  2  2  2  3  3  3  4  4  4

... 这似乎有效.但是,老兄,它丑吗!有什么建议吗?

推荐答案

您可能希望使用从zoocarry the last observation forwardna.locf()函数来替换NA值.

以下是帮助页面中的用法示例的开头:

library(zoo)

az <- zoo(1:6)

bz <- zoo(c(2,NA,1,4,5,2))

na.locf(bz)
1 2 3 4 5 6 
2 2 1 4 5 2 

na.locf(bz, fromLast = TRUE)
1 2 3 4 5 6 
2 1 1 4 5 2 

cz <- zoo(c(NA,9,3,2,3,2))

na.locf(cz)
2 3 4 5 6 
9 3 2 3 2 

R相关问答推荐

在R中,如何在使用tibble::enFrame % % unlist转换后从收件箱中重组嵌套列表?

是否可以通过另一个DF的内容过滤数据帧列表?

Facet_wrap具有不同bin宽度值的图表

从R中的函数中提取变量以及它们来自哪些环境?

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

获取列中值更改的行号

筛选出以特定顺序患病的个体

单个轮廓重叠条的单独图例

R中的时间序列(Ts)函数计数不正确

为了网络分析目的,将数据框转换为长格式列联表

计算两列中满足特定条件连续行之间的平均值

将选定的索引范围与阈值进行比较

从多层嵌套列表构建Tibble?

在gggraph中显示来自不同数据帧的单个值

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

数据集上的R循环和存储模型系数

在ggploy中创建GeV分布时出错

长/纬点继续在堪萨斯-SF结束,整齐的人口普查