说说R语言的转置

作者: xuzhougeng | 来源:发表于2019-12-03 13:49 被阅读0次

    在群里看到了一个问题,他用R语言的转置函数t()对下面形式的数据进行了转置

    转置前

    转置之后的数据结构如下

    转置后

    他发现转置之后多了一行,也就是有了geneid这一行,和他预期的不符合。按照预期,geneid这一行应该是成为列名,而不是作为输出的第一行。那么,为什么会出现这个情况呢?这就需要从t()这个函数说起。

    使用?t,你会得到关于这个函数的函数说明。在函数的Detials部分中,有这样一段

    A data frame is first coerced to a matrix: see as.matrix. When x is a vector, it is treated as a column, i.e., the result is a 1-row matrix.

    即,数据框会先用as.matrix()转成矩阵格式,然后再引用t(),最终你对一个数据框使用t()函数时,你会得到一个矩阵,而非原先的data.frame.

    举个例子:

    L3 <- LETTERS[1:3]
    fac <- sample(L3, 10, replace = TRUE)
    d <- data.frame(x = 1, y = 1:10, fac = fac)
    t(d)
    
    转置前 转置后

    因为矩阵要求存放的内容是同一种数据类型,对于输入的数据框而言,一般都会有字符串,数值这些,那么最终都会被转成字符串。

    对于最开始的问题而言,因为原先的数据框的第一列是字符串,那么自然而然会把所有的数据都变成字符串,然后把第一列变成第一行。而如果要实现他真正的目的,需要先将第第一行变成行名,然后删掉第一行在转置,也就是

    row.names(df) <- df$gene_id
    df <- df[,-1]
    df <- t(df)
    

    其结果就是先保证原来的数据框里面都是数值数据,而不是让第一列充当行名。

    延伸一下,对于超过2维的数组,我们要用到aperm函数才能对数据进行转置。当然,超过二维的转置,你甚至都无法直观感受到这是一个什么过程。

    相关文章

      网友评论

        本文标题:说说R语言的转置

        本文链接:https://www.haomeiwen.com/subject/aqdcgctx.html