用最新的非NA替换NA值,并且调用原始的非NA值?

时间:2017-01-14 00:02:58

标签: r dataframe zoo

在data.frame中,我想创建一个为每行执行以下操作的函数:

  1. 在第一个非NA
  2. 之前保留NA值
  3. 在第一个非NA值之后,向前填充" NA具有最接近的先前非NA值
  4. 用NAs替换所有原始非NA值
  5. 我意识到第2步可以通过“动物园”中的na.locf()函数来完成。包,但我不确定如何编写一个可以回忆"哪些值最初是非NA的,所以我可以在最后一步用NA替换它们。类似地,识别每行中第一个或最后一个非NA的值是直截了当的,但是中间值让我感到茫然。这是代码

    的示例
    #Example input
    dm <- data.frame(rbind(c(NA,1,NA,NA,2,NA,NA,3),
                           c(1,1,NA,2,NA,3,3,3),
                           c(NA,NA,5,NA,NA,NA,6,NA)))
    #Desired output
    dm2 <- data.frame(rbind(c(NA,NA,1,1,NA,2,2,NA),
                            c(NA,NA,1,NA,2,NA,NA,NA),
                            c(NA,NA,NA,5,5,5,NA,6)))
    > dm
      X1 X2 X3 X4 X5 X6 X7 X8
    1 NA  1 NA NA  2 NA NA  3
    2  1  1 NA  2 NA  3  3  3
    3 NA NA  5 NA NA NA  6 NA
    
    > dm2
      X1 X2 X3 X4 X5 X6 X7 X8
    1 NA NA  1  1 NA  2  2 NA
    2 NA NA  1 NA  2 NA NA NA
    3 NA NA NA  5  5  5 NA  6 
    

    关于我的数据的更多信息 - 它由整数或NA值组成,如图所示。在每一行中,数值将保持不变,增加或为NA,但永远不会减少。从理论上讲,非NA值的数量可以从1到ncol不等。

    我意识到这是一个相当具体的问题,非常感谢任何建议或帮助!

1 个答案:

答案 0 :(得分:0)

由于您要遍历行而不是列(您应该转换或重塑数据的符号),因此需要比平时更多的努力才能将正确的data.frame或vector传递给tidyr::fill或{ {1}},它将填充以下非zoo::na.locf值。完成后,您可以简单地将NA分配给新的data.frame,通过原始值的布尔掩码(不是NA)。

NA要求您传入data.frame并且仅适用于列,因此您需要转置data.frame以使用它。 tidyr将进行转置,但它也会将数据转换为矩阵,因此需要t进行转置,然后重新转置为原始形式。 data.frame(t(...))是要填充的新列的规范;如果您不确定要调用的转置列,甚至X1:X3,您可以在此使用dplyr::everything()

seq(nrow(dm))

使用dm2 <- data.frame(t(tidyr::fill(data.frame(t(dm)), X1:X3))) dm2[!is.na(dm)] <- NA dm2 ## X1 X2 X3 X4 X5 X6 X7 X8 ## X1 NA NA 1 1 NA 2 2 NA ## X2 NA NA 1 NA 2 NA NA NA ## X3 NA NA NA 5 5 5 NA 6 ,您可以类似地使用其data.frame方法:

zoo::na.locf

或将其矢量方法与dm2 <- data.frame(t(zoo::na.locf(data.frame(t(dm))))) dm2[!is.na(dm)] <- NA

一起使用
apply

请注意,您需要将其dm2 <- data.frame(t(apply(dm, 1, zoo::na.locf, na.rm = FALSE))) dm2[!is.na(dm)] <- NA 参数设置为na.rm,以免丢失前导FALSE。所有方法都返回相同的结果。

另请注意,对于第二行使用NA实际上更安全(但对我而言不太可读):

is.na<-

这里的工作方式相同。