将数值向量中的Nas替换为根据邻域计算的值 [英] Replace NAs in numeric vectors with values calculated from neighbours

查看:9
本文介绍了将数值向量中的Nas替换为根据邻域计算的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写replacena()函数,该函数将给定数值向量中的每个缺失值替换为其前后元素的算术平均值

例如,如果给定c(5, NA, 6, 2, 3, 5, 6, 4, NA, 2, NA, 5),则结果应为c(5, 5.5, 6, 2, 3, 5, 6, 4, 3, 2, 3.5, 5)

我正在寻找一些优雅的解决方案,可能是使用应用函数(没有控制流构造),但我没有找到任何可行的解决方案。我不太确定如何访问lambda函数(X)中的上一个和下一个元素。

replacena <- function(l)
{
   stopifnot(is.numeric(l))
   sapply(l[is.na(l)], function(x){ l[x] <- mean( c(l[-1:0], l[0:1]) ) } )
}

函数输入:

replacena(c(5, NA, 6, 2, 3, 5, 6, 4, NA, 2, NA, 5))

预期产量

c(5, 5.5, 6, 2, 3, 5, 6, 4, 3, 2, 3.5, 5)

有什么想法吗?

推荐答案

如果我们开始重新发明轮子(参见akrun答案),我们可以通过将您的函数修改为以下内容来实现这一点:

replacena <- function(l) {
  stopifnot(is.numeric(l))
  indx <- is.na(l)
  l[indx] <- vapply(which(indx), function(x) mean(c(l[x - 1], l[x + 1])), FUN.VALUE = double(1))
  l
}


replacena(c(5, NA, 6, 2, 3, 5, 6, 4, NA, 2, NA, 5))
## [1] 5.0 5.5 6.0 2.0 3.0 5.0 6.0 4.0 3.0 2.0 3.5 5.0

或函数的矢量化版本(不使用*apply循环)

replacena2 <- function(l) {
  stopifnot(is.numeric(l))
  indx <- which(is.na(l))
  l[is.na(l)] <- rowMeans(cbind(l[indx - 1], l[indx + 1]))
  l
}

replacena2(c(5, NA, 6, 2, 3, 5, 6, 4, NA, 2, NA, 5))
## [1] 5.0 5.5 6.0 2.0 3.0 5.0 6.0 4.0 3.0 2.0 3.5 5.0

这篇关于将数值向量中的Nas替换为根据邻域计算的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆