r - 使用NA的数量来延迟data.frame

Dan*_*Dan 2 r function lag apply

换句话说,我试图滞后一个看起来像这样的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
Run Code Online (Sandbox Code Playgroud)

对于看起来像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用了一个计算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) 
Run Code Online (Sandbox Code Playgroud)

但是这段代码只是落后于整个data.frame ...

akr*_*run 6

一种选择是循环遍历列apply并首先通过使用NA元素对NA元素进行子集来附加NA元素is.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
Run Code Online (Sandbox Code Playgroud)

  • 非常好的代码先生,您能不能给它添加一些解释,将不胜感激. (2认同)