如何在数据框中向下填充先前的值,直到 R 中列的最后一个数值?

How to fill previous value in a downwards direction in a dataframe till last numeric value of a column in R?

我有一个数据框

df= data.frame(d= c("90-1","90-2","90-3","90-4","90-5","91-5","91-6"),
              a=c(NA,NA,150,NA,1,NA,3),
              b=c(1.0,NA,90.7,30.5,NA,NA,NA),
              c=c(NA,NA,1000,2,4,NA,NA))

这里的第 1 列是非空列。
如果 NA 到每列的最后一个数值,即从第 2 列到 ncol(df).

,我想填充以前的值

需要输出

df_result= data.frame(d= c("90-1","90-2","90-3","90-4","90-5","91-5","91-6"),
               a=c(NA,NA,150,150,1,1,3),
               b=c(1.0,1.0,90.7,30.5,NA,NA,NA),
               c=c(NA,NA,1000,2,4,NA,NA)) 

已尝试代码
rev(which(df$b>0))[1] 会给我 b 列的最后一个非数值。
tidyr 的 fill 函数可以工作,但我不知道如何将两者结合起来。

任何方法都会有所帮助。

这里有一个技巧可以做到这一点。

对于 a:c 中的每一列,我们将最后一个数值后的 NA 值替换为字符串 "NA",使用 fill 替换实际 NA值并将 "NA" 值改回真实的 NA

library(dplyr)
library(tidyr)

df %>%
  mutate(across(a:c, ~replace(., is.na(.) & 
                row_number() > max(which(!is.na(.))), "NA"))) %>%
  fill(a:c) %>%
  mutate(across(a:c, ~replace(., . == 'NA', NA))) %>%
  type.convert(as.is = TRUE)

#     d   a    b    c
#1 90-1  NA  1.0   NA
#2 90-2  NA  1.0   NA
#3 90-3 150 90.7 1000
#4 90-4 150 30.5    2
#5 90-5   1   NA    4
#6 91-5   1   NA   NA
#7 91-6   3   NA   NA