【问题标题】:r - Lag a data.frame by the number of NAsr - 将数据帧滞后 NA 的数量
【发布时间】:2018-08-13 13:03:57
【问题描述】:

换句话说,我试图滞后一个看起来像这样的data.frame:

V1 V2 V3 V4 V5 V6 
1  1  1  1  1  1
2  2  2  2  2  NA
3  3  3  3  NA NA
4  4  4  NA NA NA
5  5  NA NA NA NA
6  NA NA NA NA NA

到看起来像这样的东西:

V1 V2 V3 V4 V5 V6 
1  NA NA NA NA NA
2  1  NA NA NA NA
3  2  1  NA NA NA
4  3  2  1  NA NA
5  4  3  2  1  NA
6  5  4  3  2  1

到目前为止,我使用了一个计算 NA 数量的函数,并尝试将 data.frame 中的每一列滞后于该列中相应的 NA 数量。

V1 <- c(1,2,3,4,5,6)
V2 <- c(1,2,3,4,5,NA)
V3 <- c(1,2,3,4,NA,NA)
V4 <- c(1,2,3,NA,NA,NA)
V5 <- c(1,2,NA,NA,NA,NA)
V6 <- c(1,NA,NA,NA,NA,NA)
mydata <- cbind(V1,V2,V3,V4,V5,V6)
na.count <- colSums(is.na(mydata))
lag.by <- function(mydata, na.count){lag(mydata, k = na.count)}
lagged.df <- apply(mydata, 2, lag.by) 

但是这段代码只是将整个 data.frame 滞后了一个...

【问题讨论】:

    标签: r function apply lag


    【解决方案1】:

    一种选择是循环使用apply 的列并首先通过使用is.na 对NA 元素进行子集化来附加NA 元素,然后通过否定逻辑向量(is.na) 来附加非NA 元素

    apply(mydata, 2, function(x) c(x[is.na(x)], x[!is.na(x)]))
    #     V1 V2 V3 V4 V5 V6
    #[1,]  1 NA NA NA NA NA
    #[2,]  2  1 NA NA NA NA
    #[3,]  3  2  1 NA NA NA
    #[4,]  4  3  2  1 NA NA
    #[5,]  5  4  3  2  1 NA
    #[6,]  6  5  4  3  2  1
    

    【讨论】:

    • @RavinderSingh13 谢谢,添加了更多描述。希望对你有帮助
    • 为什么使用apply 而不是lapply
    • @nicola 如果您在示例mydata &lt;- cbind(V1,V2,V3,V4,V5,V6) 中检查它,OP 创建了一个matrix
    【解决方案2】:

    您可以像这样使用带有选项na.last = FALSEsort 函数:

    编辑:

    Akrun 的评论是有效的。如果值需要保持在 data.frame 中的顺序,那么 Akrun 的答案是最好的。排序将按从低到高的顺序排列所有内容,NA 在前面。

    library(purrr)
    map_df(mydata, sort, na.last = FALSE)
    # A tibble: 6 x 6
         V1    V2    V3    V4    V5    V6
      <int> <int> <int> <int> <int> <int>
    1     1    NA    NA    NA    NA    NA
    2     2     1    NA    NA    NA    NA
    3     3     2     1    NA    NA    NA
    4     4     3     2     1    NA    NA
    5     5     4     3     2     1    NA
    6     6     5     4     3     2     1
    

    或申请:

    apply(mydata, 2, sort , na.last = FALSE)
         V1 V2 V3 V4 V5 V6
    [1,]  1 NA NA NA NA NA
    [2,]  2  1 NA NA NA NA
    [3,]  3  2  1 NA NA NA
    [4,]  4  3  2  1 NA NA
    [5,]  5  4  3  2  1 NA
    [6,]  6  5  4  3  2  1
    

    edit2:

    正如尼科洛所说。 order 可以保留变量的顺序。

    mydata[,3] <- c(4, 3, 1, 2, NA, NA)
    map_df(mydata, function(x) x[order(!is.na(x))])
    # A tibble: 6 x 6
         V1    V2    V3    V4    V5    V6
      <int> <int> <dbl> <int> <int> <int>
    1     1    NA    NA    NA    NA    NA
    2     2     1    NA    NA    NA    NA
    3     3     2     4    NA    NA    NA
    4     4     3     3     1    NA    NA
    5     5     4     1     2     1    NA
    6     6     5     2     3     2     1
    

    【讨论】:

    • 如果要保留订单,可以使用order:map_df(mydata,function(x) x[order(!is.na(x))])
    • @nicola,添加到答案中。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2018-05-18
    • 2018-09-01
    • 2014-12-22
    • 2020-08-16
    相关资源
    最近更新 更多