如何使用线性方程在数据框列中的两个已知值之间填充 NA?

问题描述 投票:0回答:1

我有几个 dfs 存储在列表中,这些列表在第一行有一个 0 值,在第 6 行或更多行周围有第一个非零值。我希望能够用一个简单的线性方程来填充 0 和我的第一个值之间的缺失值。我不在乎线性方程是否与第一个非零值之后的其他值不太吻合,我只需要将第一行 (0) 连接到每列的第一个非零值。

Var1 Var2 Var3 Var4 Var4
0 0 0 0 0 NA
1 NA NA NA NA NA
2 NA NA NA NA NA
3 NA NA NA NA NA
4 NA NA NA NA NA
5 2.03 14.567 NA 14.67 NA
6 3.467 17.87 3.32 19.54 NA
7 7.11 24.83 5.65 30.91 13.46

我的第一个想法是手动执行并为我的所有列表元素重复这 4 行,但是因为某些列在第 6 行之后有它们的第一个值,所以我需要调整并为每个异常一遍又一遍地重复相同的操作。我不想删除任何现有数据,所以我无法选择最远的值并将此方法应用于整个数据名。

list1$`df1`[2,-1] <- (list1$`df1`[6,-1]/5)*1
list1$`df1`[3,-1] <- (list1$`df1`[6,-1]/5)*2
list1$`df1`[4,-1] <- (list1$`df1`[6,-1]/5)*3
list1$`df1`[5,-1] <- (list1$`df1`[6,-1]/5)*4

我尝试在 lapply() 中使用 sapply() 来定位除 0 以外的第一个值以及相应的行,但我远未对其应用计算以填充前几行。否则,我也尝试使用类型为“fill()”的函数,但它所做的只是复制相同的值。

firstval <- lapply(list1, function(x) sapply(x[,-1], function(y) y[min(which(!is.na(y) & y>0))]

rownum <- lapply(list1, function(x) sapply(x[,-1], function(y) min(which(!is.na(y) & y>0))))

最终结果应该是这样的,所有 NA 都用 0(第一行)和第一个非零值之间的线性方程填充。

Var1 Var2 Var3 Var4 Var5
0 0 0 0 0 0
1 0.41 2.91 0.55 2.93 1.92
2 0.81 5.82 1.11 5.87 3.85
3 1.22 8.74 1.66 8.80 5.77
4 1.62 11.65 2.21 11.74 7.69
5 2.03 14.56 2.77 14.67 9.61
6 3.47 17.87 3.32 19.54 11.54
7 7.11 24.83 5.65 30.91 13.46

任何帮助将不胜感激!!

r dataframe apply lapply
1个回答
0
投票

假设我们有可重现的输入,

L
,在最后的注释中显示——下次请提供一个可重现的例子。

如图所示,将

na.approx
应用于每个数据框。

library(zoo)
lapply(L, function(x) as.data.frame(na.approx(x, na.rm = FALSE)))

注意

DF <- structure(list(Year = 0:7, Var1 = c(0, NA, NA, NA, NA, 2.03, 
3.467, 7.11), Var2 = c(0, NA, NA, NA, NA, 14.567, 17.87, 24.83
), Var3 = c(0, NA, NA, NA, NA, NA, 3.32, 5.65), Var4 = c(0, NA, 
NA, NA, NA, 14.67, 19.54, 30.91), Var4 = c(NA, NA, NA, NA, NA, 
NA, NA, 13.46)), class = "data.frame", row.names = c(NA, -8L))
L <- list(DF, DF, DF)
© www.soinside.com 2019 - 2024. All rights reserved.