【问题标题】:melting matrices with logical values [duplicate]具有逻辑值的熔化矩阵[重复]
【发布时间】:2019-07-01 11:07:07
【问题描述】:

我有一个成对比较的矩阵,其中上三角和对角线设置为NA

df <- data.frame(a=c(NA,1,2), b=c(NA,NA,3), c=c(NA,NA,NA))
row.names(df) <- names(df)

I want to transform the matrix to long format, for which the standard procedure is to use reshape2's melt,然后是na.omit,所以我想要的输出是:

Var1 Var2 Value
a     b   1
a     c   2
b     c   3

但是,df$c 全部为 NA,因此是合乎逻辑的,并且将被melt 用作非测量变量。 因此,melt(df) 的输出不是我想要的。

library(reshape2)
melt(df)

如何防止melt使用df$c作为id变量?

【问题讨论】:

    标签: r reshape2


    【解决方案1】:

    诀窍是将行名转换为列,然后再转换为长格式。在tidyverse 中这样做的一种方法是,

    library(tidyverse)
    
    df %>% 
      rownames_to_column() %>% 
      gather(var, val, -1) %>% 
      filter(!is.na(val))
    
    
    #  rowname var val
    #1       b   a   1
    #2       c   a   2
    #3       c   b   3
    

    正如@Humpelstielzche 在 cmets 中提到的,gather 中有一个 na.rm 参数,因此我们可以省略最后的过滤,即

    df %>% 
     rownames_to_column() %>% 
     gather(var, val, -1, na.rm = TRUE)
    

    【讨论】:

    • 你可以在集合中指定na.rm = T
    【解决方案2】:

    虽然您已经有了其他答案,但如果调用了适当的函数,可以通过reshape2melt 来实现。在这种情况下,您不希望应用reshape2:::melt.data.frame,而是应用reshape2:::melt.matrix。所以,试试:

    melt(as.matrix(df), na.rm=TRUE)
    #  Var1 Var2 value
    #2    b    a     1
    #3    c    a     2
    #6    c    b     3
    

    如果您随后查看?reshape2:::melt.data.frame,您将看到以下声明:

    此代码在概念上类似于“as.data.frame.table”

    这意味着你也可以使用更复杂的:

    na.omit(as.data.frame.table(as.matrix(df), responseName="value"))
    #  Var1 Var2 value
    #2    b    a     1
    #3    c    a     2
    #6    c    b     3
    

    【讨论】:

      【解决方案3】:

      在base R中,我们可以使用rowcol分别获取行名和列名,然后过滤NA的值。

      df1 <- data.frame(col = colnames(df)[col(df)], row = rownames(df)[row(df)], 
                        value = unlist(df), row.names = NULL)
      
      df1[!is.na(df1$value), ]
      
      #  col row value
      #2   a   b     1
      #3   a   c     2
      #6   b   c     3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-26
        • 2018-11-08
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多