如何在数据框中向下填充先前的值,直到 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
我有一个数据框
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