r - 如何在不更改名称本身的情况下向列名“添加”其他信息?

时间:2013-11-29 15:54:02

标签: r grouping r-factor columnname

我有一个包含单个列名称的矩阵(行名称并不重要),如下所示

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”命令运用到我的列名中,但是没有得到任何结果。 是否有诀窍或命令,我可能从未听说过?

3 个答案:

答案 0 :(得分:1)

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

> 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

是吗(0为低于40)?

答案 1 :(得分:1)

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

数据和注释在数据上的协调整合是一件非常好的事情,当矩阵和注释是独立的时,减少了“文书”错误的机会;我很惊讶这么多意见建议你分别保留两种结构。

答案 2 :(得分:0)

感谢所有有用的评论。自从我的原帖以来,我没有在这里发帖,因为我首先想尝试所有有前景的方法并找到问题的最终解决方案。

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

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

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

我已经说过,如果我将我的列名分组用于分组,则R稍后会对我的组进行编号,因此它们不再是完美的。

但我刚刚搜索了第一个这样的必要信件,以确定合适的群体:

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

这样我总能检查一组列与其他列的比例。

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

干杯!