0

给定以下数据框:

df1 <- data.frame(Company = c('A','B','C','D','E'), `X1980` = c(NA, 5, 3, 8, 13),
                                `X1981` = c(20, NA, 23, 11, 29),
                                `X1982` = c(NA, 32, NA, 41, 42),
                                `X1983` = c(45, 47, 53, 58, NA))

我想通过对行进行插值来用值替换 NA,从而产生以下数据框:

Company  1980  1981  1982  1983
   A      NA    20   32,5   45
   B      5    18,5   32    47
   C      3     23    38    53
   D      8     11    41    58
   E      13    29    42    NA

我尝试将 na.apporox 与 apply 结合使用:

df1[-1] <- t(apply(df1[-1], 1, FUN = na.approx))

但这会导致以下错误:

Fehler in h(simpleError(msg, call)) : 
  Fehler bei der Auswertung des Argumentes 'x' bei der Methodenauswahl für Funktion 't': dim(X) muss positive Länge haben

提前感谢您的帮助!!!

编辑:我忘了定义如何在 na.approx 函数中处理 NA。

df1[-1] <- t(apply(df1[-1], 1, na.approx, na.rm=FALSE))

这会产生所需的输出!

4

1 回答 1

1

据我所知,这种插值方法不处理NA序列末尾的 's,这是条目 Ex1983 的情况。因此,na.approx(至少是zoo包中的那个)提供了一个可选参数na.rm供您选择是否要删除这些 NA。

默认情况下它是TRUE,所以它会删除,给你的矩阵一个只有 3 个元素的第 4 列,而不是 4 (作为其余列),所以它会产生那个错误。要解决这个问题,您只需将该参数设置为FALSE

df1[-1] <- t(apply(df1[-1], 1, FUN = zoo::na.approx, na.rm=FALSE))

输出:

> df1
  Company X1980 X1981 X1982 X1983
1       A    NA    20    NA    45
2       B     5    NA    32    47
3       C     3    23    NA    53
4       D     8    11    41    58
5       E    13    29    42    NA

为了填写 NA,如果您需要我,我可以帮助您使用此处的答案。

于 2020-11-13T12:48:46.260 回答