【问题标题】:r - How can I "add" additional information to column names without altering the names themselves?r - 如何在不更改名称本身的情况下向列名“添加”附加信息?
【发布时间】:2013-12-15 20:47:45
【问题描述】:

我有一个带有单独列名的矩阵(行名不重要),像这样

TestMat<-matrix(1:25,ncol=5,nrow=5)
colnames(TestMat)<-c("A","B","C","D","E")
TestMat

由于各种原因,但主要是因为包以后需要它,我无法更改矩阵中的值,它们都必须是整数。 现在我想将我的列名称分类(例如 A、B 和 D 归入“第 1 组”,C 和 E 归入“第 2 组”)。这个想法是,矩阵稍后会变小,因为矩阵中的值会随机减少。一旦列总和达到零,该列将被删除。在这个过程中,我想看看一个组的分数/大小与其他组相比如何变化。 我认为最简单的方法是将所有相应的列命名为相同:

TestMat2<-matrix(1:25,ncol=5,nrow=5)
colnames(TestMat2)<-c("Group1","Group1","Group2","Group1","Group2")
TestMat2

但这给了我稍后在分析中的错误消息,因为 R 开始以“Group1”“Group1.1”“Group2”“Group1.2”“Group2.1”的方式对相同的列名进行编号.

我已经尝试对列名使用“class”、“attr”和“factor”命令,但没有得到任何结果。 有没有什么技巧或命令,我可能从未听说过?

【问题讨论】:

  • 为什么不在单独的向量中?那肯定会使代码更简单?
  • 听起来您可能更乐意创建几列 factors 并使用它们来处理您的数据子集。

标签: r grouping r-factor columnname


【解决方案1】:

根据 cmets 为什么不将分组放在另一个变量中,然后是:

> TestMat<-matrix(1:25,ncol=5,nrow=5)
> colnames(TestMat)<-c("A","B","C","D","E")
> F=factor(c("Group1","Group1","Group2","Group1","Group2"))

...对你的矩阵做点什么...

> summary(F[colSums(TestMat) >= 40])
Group1 Group2 
     1      2

是这样吗(subs. 40 for 0)?

【讨论】:

  • ...whoooosshh...风滚草..我不知道我为什么要打扰。
【解决方案2】:

BioconductorBioboase 定义了一个类 ExpressionSet,它允许对矩阵的行和列进行注释

library(Biobase)
exprs = matrix(1:25,ncol=5,nrow=5, dimnames=list(NULL, LETTERS[1:5]))
df = data.frame(grp=c("Group1","Group1","Group2","Group1","Group2"), 
                row.names=colnames(exprs))
eset = ExpressionSet(exprs, AnnotatedDataFrame(df))

您可以使用$ 访问数据框中的列,使用[ 访问子集,使用exprs() 进行提取,例如,

> exprs(eset[, eset$grp == "Group1"])
  A  B  D
1 1  6 16
2 2  7 17
3 3  8 18
4 4  9 19
5 5 10 20

> eset[,colSums(exprs(eset)) > 40]$grp
[1] Group2 Group1 Group2
Levels: Group1 Group2

GenomicRanges 包定义了一个类似的类 SummarizedExperiment,当行用基因组范围进行注释时。

数据和注释的这种协调集成是一件非常好的事情,当矩阵和注释独立时,减少了“文书”错误的机会;我很惊讶这么多 cmets 建议您分别维护两个结构。

【讨论】:

    【解决方案3】:

    感谢所有有用的 cmets。自从我的原始帖子以来,我还没有在这里发帖,因为我首先想尝试所有有希望的方法并找到解决我问题的最终解决方案。

    我尝试了Biobase 包及其注释选项,以及斯蒂芬通过第二个变量对所有内容进行分组的想法。

    事实证明,一旦矩阵尺寸减小(作为分析的一部分),外部分组就会失败,因为列号和分组不再匹配,我找不到组合的方法Bioconductor 方法和我的代码。

    不过,如果有人关心的话,我找到了一个(有点迂回的)解决方案:

    我已经说过,如果我将列名分组为相同的分组,R 稍后会为我的组编号,因此它们不再相同。

    但我只是搜索了第一个这样那样的必要字母来识别正确的组:

    length(colnames(TestMat2)[substr(colnames(TestMat2),1,6) == "Group1"])
    

    这样我总是可以检查一组列与其他列的分数。

    感谢您的回答和帮助。我学到了很多,我认为Bioconductor 将来会派上用场。

    干杯!

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2013-05-04
      • 2020-07-03
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多