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

时间:2019-08-22 12:21:17

标签: r sorting rows na

我有一个数据框,其中包含列中的值和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值堆叠到每一列的顶部来

。有没有简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:4)

您可以使用lapply通过NA值对每一列进行排序。请记住,这将保留非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")

答案 1 :(得分:0)

这应该可以解决问题:

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

答案 2 :(得分:0)

您可以使用data.table软件包以提高灵活性-

> setDT(df1)

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

注意:您可以选择使用要订购的列。

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