【问题标题】:How to build a matrix from a dataframe based on the values of a specific column?如何根据特定列的值从数据框中构建矩阵?
【发布时间】:2016-07-19 21:06:56
【问题描述】:

我有一个名为 df 的数据框,如下所示:

Genes         ID          Type 
CFH         MB-0002       Gain 
CFHR3       MB-0002       Gain 
DEFB131     MB-0003       Gain 
UNC93B5     MB-0003       Loss 
CCDC125     MB-0004       Loss 
CCNB1       MB-0002       Gain
CFH         MB-0004       Loss
CCNB1       MB-0003       Gain   

我想构建一个矩阵,比如Mat,并将其写入一个csv 文件,其中我将Genes 作为行,IDs 作为列。我想说:

  • 1 如果对应的类型是Gain
  • -1 如果对应的类型是Loss
  • 0 在所有其他地方。

我的矩阵示例是:

                MB-0002 MB-0003 MB-0004
   CFH              1       0      -1
   CFHR3            1       0       0
   DEFB131          0       1       0
   UNC93B5          0      -1       0
   CCDC125          0       0      -1
   CCNB1            1       1       0

【问题讨论】:

  • 感谢编辑! @m0h3n

标签: r matrix dataframe


【解决方案1】:

试试:

xtabs(c(1L, -1L)[Type] ~ ., data=df)
#         ID
#Genes     MB-0002 MB-0003 MB-0004
#  CCDC125       0       0      -1
#  CCNB1         1       1       0
#  CFH           1       0      -1
#  CFHR3         1       0       0
#  DEFB131       0       1       0
#  UNC93B5       0      -1       0

xtab()table() 类似,不同之处在于它采用一个包含每个级别组合的频率计数的变量。您可以使用as.data.frame() 将结果转换回数据框。

公式的左侧给出了“计数”(在本例中是要填充列联表的值)。它使用已知的技巧通过索引将因子转换为数字向量(请参阅?factor)。右侧的. 是“数据框中的其余变量”的快捷方式,在这种情况下相当于Genes + ID

【讨论】:

  • 其实需要解释的是LHS表达式。我盯着它看的时间比我通常需要的 R 代码还要长。它很可爱,但对于新的 R 用户来说可能有点晦涩。
  • @ernest-a 谢谢。它正在工作。但是,我尝试了以下代码:for(i in 1:nrow(df)){ if(df$Type[i]=='Gain'){ Mat[df$Genes[i], df$ID[i]] <- '1' }else if (df$Type[i]=='Loss'){ Mat[df$Genes[i], df$ID[i]] <- '-1' } } 但它显示以下错误:Error in [(*tmp*, df$Genes[i], df$ID[i], value = "-1") : subscript out of bounds。谁能告诉我是什么原因?
  • @rawr 不,我使用了答案。我只是好奇为什么我的代码不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2016-02-14
相关资源
最近更新 更多