将非 NA 值堆叠到每列的顶部

Stack non-NA values to the top of each column

我有一个数据框,其中包含列中的值和 NA。数据框如下所示:

A     B     C     D
1     NA    NA    NA
NA    2     3     NA
NA    4     NA    NA
5     NA    NA    6

我正在尝试将其转换成如下形式:

A     B     C     D
1     2     3     6
5     4     NA    NA
NA    NA    NA    NA
NA    NA    NA    NA

通过将非 NA 值堆叠到每列的顶部。有没有简单的方法可以做到这一点?

您可以使用 lapplyNA 值对每一列进行排序。请记住,这会保留非 NA 列顺序,而 x[order(x)] 只会对列重新排序:

df1[] <- lapply(df1, function(x) x[order(is.na(x))])

df1
   A  B  C  D
1  1  2  3  6
2  5  4 NA NA
3 NA NA NA NA
4 NA NA NA NA

数据:

df1 <- read.table(header = T, text = "A     B     C     D
1     NA    NA    NA
NA    2     3     NA
NA    4     NA    NA
5     NA    NA    6")

这应该可以解决问题:

data<- data.frame(A=c(1, NA,NA,5),
                  B=c(NA,2,4,NA),
                  C=c(NA,3,NA,NA),
                  D=c(NA,NA,NA, 6))



apply(data,2,function(x)c(x[!is.na(x)], rep(NA,(length(x)-length(x[!is.na(x)])))) )                              
      A  B  C  D
[1,]  1  2  3  6
[2,]  5  4 NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA

您可以使用 data.table 包以获得更大的灵活性 -

> setDT(df1)

> df1[,(names(df1)) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=names(df1)]

注意:您可以select使用要排序的列。

> df1[,(c("A","B")) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=c("A","B")]