首页 > 解决方案 > 用以前的非 NA 可用值 R 填充 NA

问题描述

我正在尝试用一组 300 万行数据中可用的非 NA 值填充 NA 值。目前我能够做到,但大约需要 3 小时。

约束 - 我不能使用任何库,必须使用 R basic

数据 - 我的数据如下所示(摘录)

数据提取为例

目前我一直在使用以下代码

CHARDIF <- diff(VERINDEX_VEC)

k = 1
for (j in VERINDEX_VEC){
  #when value is in vector calculate difference to next value and copy VER. 
Special cases for First and Last value
  ifelse(j == 1, ALL_POS$C01[j:CHARDIF[k]] <- ALL_POS$C01[j],
         ifelse(j == max(VERINDEX_VEC), ALL_POS$C01[j:max(as.numeric
(row.names(ALL_POS)))] <- ALL_POS$C01[j],ALL_POS$C01[j:(j+CHARDIF[k]-1)] <- 
ALL_POS$C01[j]))
  k = k + 1
}

如您所见,我有一个带有非 NA 位置的向量,然后计算位置之间的差异,这有助于我选择要粘贴的范围,因为我知道何时发生下一个非 NA 值。

有没有人有更好的解决方案?特别是更快的

标签: rtext

解决方案


首先我会生成随机数据来测试这个

# generate random data 
test_data <- data.frame(x = 1:100, y = rnorm(100))
# add random NAs
test_data$y[sample(1:100, 50)] <- NA

现在试试这个:

# locate non NAs in the wanted column
not_na <- which(!is.na(test_data$y))

# define the function replace_NAs_custom

replace_NAs_custom <- function(i, col){
         if(is.na(col[i])){
           col[i] <- col[max(not_na[not_na < i] )]
         }
         return(col[i] )
       }

test_data$y_2 <- unlist(lapply(1:nrow(test_data), replace_NAs_custom, test_data$y))

推荐阅读