如何在R中将数据帧转换为矩阵

如何在R中将数据帧转换为矩阵,r,matrix,dataframe,reshape,R,Matrix,Dataframe,Reshape,我想将一个命名向量转移到矩阵,并填充缺失的值(用0填充) 例如,我有这样一个数据帧: col1 col2 col3 Cancer1 Gene1 2.1 Cancer1 Gene2 2.51 Cancer1 Gene3 3.0 Cancer2 Gene1 0.9 它有两列名称:col1和col2。然后我想把它转换成一个矩阵,比如: Cancer1 Cancer2 Gene1 2.1 0.9 Gene2 2.51

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

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

col1     col2    col3
Cancer1  Gene1   2.1
Cancer1  Gene2   2.51
Cancer1  Gene3   3.0
Cancer2  Gene1   0.9
它有两列名称:
col1
col2
。然后我想把它转换成一个矩阵,比如:

        Cancer1   Cancer2
Gene1   2.1       0.9
Gene2   2.51      0
Gene3   3.0       0
如果向量中缺少值,请用0填充


我怎样才能在R中有效地做到这一点?

你可以做一个嵌套的SAPPY,循环遍历每个基因和癌症类型。如果有因子,则使用levels;如果有字符向量,则使用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

my.df你可以做一个嵌套的SAPPY,循环遍历每个基因和癌症类型。如果有因子,则使用levels;如果有字符向量,则使用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

my.df您可以使用
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您可以使用
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要么
xtabs
要么
tapply
应该这样做

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
可能会为您提供一个“特殊”类的数据对象(而不是矩阵),如果您不期望它们,可能会有令人讨厌的属性,或者如果您期望它们可能看起来很好。

xtabs
tapply
都应该这样做

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
可能会为您提供一个“特殊”类的数据对象(而不是矩阵),如果您不期望它们,可能会有令人讨厌的属性,或者如果您期望它们,可能看起来很好。

我觉得您想将data.frame转换为矩阵……是的。它是一个data.frame,但只有一列值。其他是名称。
tidyr::spread(mydata,col1,col3)
您需要
xtabs(col3~col1+clo2,data=your.data.frame.name)
。这将返回一个从matrix类继承方法的表对象。@42-
xtabs(col3~col2+col1,data=your.data.frame.name)
正是OP想要的。(行中有基因,列中有癌症)在我看来,你想把data.frame转换成矩阵……是的。它是一个data.frame,但只有一列值。其他是名称。
tidyr::spread(mydata,col1,col3)
您需要
xtabs(col3~col1+clo2,data=your.data.frame.name)
。这将返回一个从matrix类继承方法的表对象。@42-
xtabs(col3~col2+col1,data=your.data.frame.name)
正是OP想要的。(行中的基因和列中的癌症)
else{NA
应该是
else{0
。比它应该复杂得多。@Masoud:About
else{NA
…你是对的…但前提是你假设基因表达水平缺失,因为它根本不在所选样本中表达…@DamianoFantini“如果载体中缺少值,请用0填充。”OP明确地想要零。我知道请求中说了什么,我告诉过你是对的……我只是建议在处理基因表达数据时要小心这些生物学假设。仅此而已。
else{NA
应该是
else{0
。比它应该复杂得多。@Masoud:About
else{NA
…你是对的…但前提是你假设基因表达水平缺失,因为它根本不在所选样本中表达…@DamianoFantini“如果载体中缺少值,请用0填充。”OP明确地想要零。我知道请求中说了什么,我告诉过你是对的……我只是建议在处理基因表达数据时要小心这些生物学假设。仅此而已。