r-通过NA数量延迟data.frame

时间:2018-08-13 13:03:57

标签: r function apply lag

换句话说,我试图滞后一个像这样的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滞后一个...

2 个答案:

答案 0 :(得分:6)

一种选择是通过apply遍历各列,并先通过使用is.na设置NA元素来附加NA元素,然后通过取消逻辑矢量({{ 1}})

is.na

答案 1 :(得分:4)

您可以将sort函数与选项na.last = FALSE一起使用,如下所示:

编辑:

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

正如nicolo所说。 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