我有几个 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 |
任何帮助将不胜感激!!
假设我们有可重现的输入,
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)