【问题标题】:How to convert a dataframe to a matrix如何将数据框转换为矩阵
【发布时间】:2017-08-14 21:00:41
【问题描述】:

我想将命名向量转移到矩阵并填充缺失值(用 0 填充)。

例如,我有一个这样的数据框:

col1     col2    col3
Cancer1  Gene1   2.1
Cancer1  Gene2   2.51
Cancer1  Gene3   3.0
Cancer2  Gene1   0.9

其中有两列名称:col1col2。然后我想把它转换成一个矩阵,比如:

        Cancer1   Cancer2
Gene1   2.1       0.9
Gene2   2.51      0
Gene3   3.0       0

如果向量中有缺失值,用0填充。

如何在 R 中有效地做到这一点?

【问题讨论】:

  • 在我看来您想将 data.frame 转换为矩阵...
  • 是的。它是一个 data.frame,但只有一列值。其他的是名字。
  • tidyr::spread(mydata, col1, col3)
  • 你想要xtabs(col3 ~ col1 +clo2, data=your.data.frame.name)。这将返回一个从矩阵类继承方法的表对象。
  • @42- xtabs(col3 ~ col2 +col1, data=your.data.frame.name) 将正是 OP 想要的。 (行中的基因和列中的癌症)

标签: r matrix dataframe reshape


【解决方案1】:

你可以使用tidyr包:

tidyr::spread(mydata, col1, col3, fill = 0)

#    col2 Cancer1 Cancer2 
# 1 Gene1    2.10     0.9 
# 2 Gene2    2.51     0.0 
# 3 Gene3    3.00     0.0

数据:

mydata <- structure(list(col1 = structure(c(1L, 1L, 1L, 2L), .Label = c("Cancer1", 
"Cancer2"), class = "factor"), col2 = structure(c(1L, 2L, 3L, 
1L), .Label = c("Gene1", "Gene2", "Gene3"), class = "factor"), 
col3 = c(2.1, 2.51, 3, 0.9)), .Names = c("col1", "col2", 
"col3"), class = "data.frame", row.names = c(NA, -4L))

【讨论】:

    【解决方案2】:

    xtabstapply 都应该这样做。

    tapply(my.df$col3, rev(my.df[-3]), c)
           col1
    col2    cancer1 cancer2
      gene1     2.1     2.2
      gene2     2.5      NA
      gene3      NA     3.0
    

    tapply 的优势在于,如果任何一个组合有多个实例,您可以返回一个函数结果,例如应用于组的mean

    xtabs(col3 ~ col2 +col1, my.df)  #same matrix result
    

    请注意,使用 tidyverse 之类的 spread 方法可能会为您提供“特殊”类(不是矩阵)的数据对象,如果您不期望它们可能具有烦人的属性,或者如果您 正在期待它们看起来很棒。

    【讨论】:

      【解决方案3】:

      你可以做一个嵌套的 sapply,循环遍历每个基因和癌症类型。如果您有因子,请使用级别,如果您有字符向量,请使用 unique()。

      my.df <- data.frame(col1=c("cancer1", "cancer1", "cancer2", "cancer2"),
                 col2=c("gene1", "gene2", "gene3", "gene1"), 
                 col3=c(2.1, 2.5, 3.0, 2.2))
      
      my.mat <- sapply(levels(my.df$col1), (function(cancer){
        sapply(levels(my.df$col2), (function(gene){
          tmp <- my.df[my.df$col1 == cancer & my.df$col2 == gene, "col3"]
          if (length(tmp) > 0) {
            as.numeric(tmp[1])
          } else {
            NA
          }
        }))
      }))
      my.mat
      

      【讨论】:

      • else { NA 应该是else { 0
      • 比它应该的复杂得多。
      • @Masoud:关于else { NA...您是对的...但前提是您假设基因表达水平缺失,因为它根本没有在选定的样本中表达。 ..
      • @DamianoFantini “如果向量中有缺失值,则用 0 填充。” OP 明确想要零。
      • 我知道请求中所说的内容,我告诉过你是对的……我只是建议在处理基因表达数据时要小心这些生物学假设。就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2020-12-09
      • 2020-07-05
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多