【问题标题】:How to move the NA's from top of each column to below of each column in a matrix如何将 NA 从每列的顶部移动到矩阵中每列的下方
【发布时间】:2022-11-14 19:24:49
【问题描述】:

这是我现在的桌子

    c1   c2   c3   c4   c5
r1  1    NA   NA   NA   NA
r2  1    1    NA   NA   NA
r3  1    1    1    NA   NA
r4  1    1    1    1    NA
r5  1    1    1    1    1

我想在每列的底部移动 NA,然后向上移动非 NA 数字而不做任何事情或在矩阵中排列非 NA 值(假设非 NA 值是唯一的),我只是希望它们移动向上并使 NA 位于底部,如下所示:

    c1   c2   c3   c4   c5
r1  1    1    1    1    1
r2  1    1    1    1    NA
r3  1    1    1    NA   NA
r4  1    1    NA   NA   NA
r5  1    NA   NA   NA   NA

有什么功能可以做我想做的事情吗?我已经找到了类似的question,但问题与我的相反,所以我不能真正使用该问题中的答案。任何帮助,将不胜感激。

【问题讨论】:

  • 您可以使用其他线程中的解决方案,只需添加order(!is.na(x), decreasing = TRUE)。或者,也许更方便的是,不要否定order(is.na(x))
  • 你总是只有两个值吗? 1和NA?

标签: r matrix


【解决方案1】:

用一个更好的例子

df=data.frame(outer(1:5,1:5))
df[upper.tri(df)]=NA

  X1 X2 X3 X4 X5
1  1 NA NA NA NA
2  2  4 NA NA NA
3  3  6  9 NA NA
4  4  8 12 16 NA
5  5 10 15 20 25

sapply(df,function(x){c(x[!is.na(x)],rep(NA,sum(is.na(x))))})

     X1 X2 X3 X4 X5
[1,]  1  4  9 16 25
[2,]  2  6 12 20 NA
[3,]  3  8 15 NA NA
[4,]  4 10 NA NA NA
[5,]  5 NA NA NA NA

【讨论】:

    【解决方案2】:

    使用 tidyverse 有点笨拙,因为您必须将数据放入数据帧然后放回矩阵,但功能非常简单:

    library(tidyverse)
    mat <- read_csv("c1,c2,c3,c4,c5
             1, NA,NA,NA,NA
             1, 1, NA,NA,NA
             1, 1, 1, NA,NA
             1, 1, 1, 1, NA
             1, 1, 1, 1, 1")
    
    as.matrix(map_dfc(mat, function(x) rev(x)))
    
    >     c1 c2 c3 c4 c5
    >[1,]  1  1  1  1  1
    >[2,]  1  1  1  1 NA
    >[3,]  1  1  1 NA NA
    >[4,]  1  1 NA NA NA
    >[5,]  1 NA NA NA NA
    

    【讨论】:

      【解决方案3】:
      df[] <- lapply(df, sort, na.last = TRUE)
      
      #    c1 c2 c3 c4 c5
      # r1  1  1  1  1  1
      # r2  1  1  1  1 NA
      # r3  1  1  1 NA NA
      # r4  1  1 NA NA NA
      # r5  1 NA NA NA NA
      

      (可重现的)数据

      df = data.frame(
        c1 = c(1, 1, 1, 1, 1), 
        c2 = c(NA, 1, 1, 1, 1), 
        c3 = c(NA, NA, 1, 1, 1), 
        c4 = c(NA, NA, NA, 1, 1), 
        c5 = c(NA, NA, NA, NA, 1),
        row.names = c("r1", "r2", "r3", "r4", "r5")
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多