【问题标题】:Stack non-NA values to the top of each column将非 NA 值堆叠到每列的顶部
【发布时间】:2019-08-22 12:21:17
【问题描述】:

我有一个数据框,其中包含列中的值和 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 值堆叠到每列的顶部。有没有简单的方法来做到这一点?

【问题讨论】:

    标签: r sorting rows na


    【解决方案1】:

    您可以使用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")
    

    【讨论】:

    • 嗨,您的代码和df1 &lt;- data.frame(lapply(df1, function(x) x[order(is.na(x))])) 之间有区别吗(我本来会这样做,但我发现您的 df1[] 答案很有趣)?
    • 嘿@Gainz,我认为没有什么不同,除了它应该保留类并且您的方法可能会将字符强制转换为因素。如果您想了解更多关于使用[]lapply 的信息,可以查看Extract.data.frame 帮助页面。
    【解决方案2】:

    这应该可以解决问题:

    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
    

    【讨论】:

      【解决方案3】:

      您可以使用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")]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多