用 R 中该行的最新非 NA 值替换特定列中的 NA

Replacing NA from a specific column with latest non-NA value from that row in R

我有一个看起来像这样的大数据框

library(tidyverse)
df <- tibble(fruits=c("apple","banana","ananas"),
             col1=c(4,NA,NA),
             col2=c(5,NA,10),
             col3=c(10,100,5),
             col4=c(20,4,1))
df
#> # A tibble: 3 × 5
#>   fruits  col1  col2  col3  col4
#>   <chr>  <dbl> <dbl> <dbl> <dbl>
#> 1 apple      4     5    10    20
#> 2 banana    NA    NA   100     4
#> 3 ananas    NA    10     5     1

reprex package (v2.0.1)

于 2022-03-13 创建

当只有 col1 有一个 NA 值时,我想用该行的最后一个非 NA 值填充 NA,并且 return 将该值填充为 NA。

我希望我的数据看起来像这样。

#> # A tibble: 3 × 5
#>   fruits  col1  col2  col3  col4
#>   <chr>  <dbl> <dbl> <dbl> <dbl>
#> 1 apple      4     5    10    20
#> 2 banana    100   NA    NA     4
#> 3 ananas    10    NA     5     1

如果它很大 data.frame,使用矢量化解决方案而不是遍历行可能更有效。获取'col1'中为NA('i1')元素的逻辑索引,使用max.col到returnfirst的列索引non-NA 从第 3 列到第 5 列的元素 ('j1'),用 cbind 创建一个 row/column 索引矩阵 (m1),分配 'col1' 其中有使用 'm1' 从 3 到 5 列中提取元素的缺失值,并将这些元素分配给 NA

df1 <- as.data.frame(df)
i1 <- is.na(df1$col1)
j1 <- max.col(!is.na(df1[3:5]), "first")
m1 <- cbind(which(i1), j1[i1])
df1$col1[i1] <- df1[3:5][m1]
df1[3:5][m1] <- NA

-输出

> df1
  fruits col1 col2 col3 col4
1  apple    4    5   10   20
2 banana  100   NA   NA    4
3 ananas   10   NA    5    1