-1

我有一个数据框(new_t),其中行=菌株(其中 28 个),列是基因(其中 12559 个),单元格是这些基因的表达值。我想看看每个基因与最后一个基因的相关性。所以我想像向量一样将每一列与最后一列向量进行比较..

> rr<-matrix()
> for (i in 1:ncol(new_t)) {
  bb<-cor(x=new_t[,i], method='spearman', y=new_t[,12559])
  rr<-cbind(rr, bb)
  }

我的问题是,当循环完成时,形成的 rr 全部由 bb 组成.. 如 bb bb bb bb ......

如果我将 rr 更改为数据框,则会出现错误

Error in data.frame(..., check.names = FALSE) : 
 arguments imply differing number of rows: 0, 1

任何帮助表示赞赏

4

2 回答 2

0

您可以使用apply来避免for循环并获得相同的结果。

一个玩具例子

> set.seed(1)
> new_t <- matrix(rnorm(100, 100, 3), 10)
> apply(new_t, 2, cor, method="spearman", y=new_t[,10])
 [1] -0.30909091 -0.17575758  0.41818182 -0.36969697 -0.33333333  0.10303030 -0.18787879 -0.36969697
 [9]  0.01818182  1.00000000

我认为你的数据应该是:

apply(new_t, 2, cor, method="spearman", y=new_t[,12559])

甚至更简单地使用cor不使用apply并从相关矩阵中选择最后一列。

> cor(new_t, method="spearman")[, ncol(new_t)]
 [1] -0.30909091 -0.17575758  0.41818182 -0.36969697 -0.33333333  0.10303030 -0.18787879 -0.36969697
 [9]  0.01818182  1.00000000
于 2013-09-03T16:19:01.617 回答
0

cbind( ?cbind) 的帮助页面:

如果有多个矩阵参数,它们必须都具有相同的列数(或行数),这将是结果的列数(或行数)。如果所有参数都是向量,则结果中的列(行)数等于最长向量的长度。较短参数中的值被回收以达到此长度(如果仅部分回收它们,则会发出警告)。

当参数由矩阵和向量的混合组成时,结果的列(行)数由矩阵参数的列(行)数决定。任何向量都将其值回收或子集化以达到此长度。

...

数据框方法cbind只是. data.frame(..., check.names = FALSE)这意味着它将拆分数据框参数中的矩阵列,并将字符列转换为因子,除非 stringsAsFactors = FALSE指定。

我怀疑你混淆了行数。我不确定您为什么会遇到错误matrix(),因为您没有提供可重现的示例。应用cbinddata.frame()会抛出错误,因为行数不匹配。

## this seems to work
cbind(matrix(),cor(1:10,2:11))
#      [,1] [,2]
# [1,]   NA    1

## this throws an error
cbind(data.frame(),1)
# Error in data.frame(..., check.names = FALSE) : 
#   arguments imply differing number of rows: 0, 1

你最好完全避免 for 循环并使用applyor sapply

sapply(seq_len(ncol(new_t)), function(i) 
  cor(x=new_t[,i], method='spearman', y=new_t[,12559]))
于 2013-09-03T16:20:28.297 回答