首页 > 解决方案 > 用 R 向量中先前数字的修改版本替换 NA

问题描述

我有一个带有一些 NA 的向量,我想用之前的非 NA 值减去 0.1 替换其中的一些 NA。如果 NA 字符串长于某个长度(例如,2),我也不想替换 NA。这是一个例子

x <- c(1:3, NA, 4, NA, NA, 5, NA, NA, NA, 6, NA)

我想做一个看起来像的向量

x_prime <- c(1:3, 2.9, 4, 3.9, 3.8, 5, NA, NA, NA, 6, 5.9)

打印出来看起来像:

> x_prime
 [1] 1.0 2.0 3.0 2.9 4.0 3.9 3.8 5.0  NA  NA  NA 6.0  5.9

作为一个额外的复杂因素,我想跟踪我修改的索引,所以我还想要一个看起来像的向量

idx <- c(4, 6, 7, 13)

如果是 NA 中的第一个位置(以及所有领先的 NA),我们可以离开它并且什么也不做。

我在 SO like this上发现了一些类似的问题,并且我尝试了与那里介绍的功能类似的功能,但没有成功。有任何想法吗?先感谢您。

标签: rvectornamissing-data

解决方案


基础 R 选项ave

len <- 2
x1 <- ave(x, cumsum(!is.na(x)), FUN = function(v) {
  if(length(v) > len + 1) v 
  else v[1] - seq(0, by= 0.1, length.out = length(v))
  })

x1
#[1] 1.0 2.0 3.0 2.9 4.0 3.9 3.8 5.0  NA  NA  NA 6.0 5.9

我们NA与第一个非 NA 值一起创建值组,并将其用于ave. 如果组长度大于len + 1+ 1因为第一个值不在NA每个组中),那么我们不会更改组中的任何内容,否则我们从组中的第一个值中减去 0、0.1、0.2。


要获得被替换的位置,找出不在NA的位置。xNAx1

which(is.na(x) & !is.na(x1))
#[1]  4  6  7 13

推荐阅读