【问题标题】:trouble in loop in R: matrix or data frame in the beginning?R中的循环麻烦:开始时的矩阵或数据框?
【发布时间】:2013-09-06 22:44:31
【问题描述】:

我有一个数据框 (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

感谢任何帮助

【问题讨论】:

    标签: r for-loop matrix dataframe


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 谢谢你我使用了应用功能并解决了这个问题。感谢您的快速响应。
    【解决方案2】:

    来自cbind(?cbind)的帮助页面:

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

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

    ...

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

    我怀疑您混淆了行数。我不确定您为什么会收到matrix() 的错误,因为您没有提供reproducible example。将cbind 应用于data.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 循环并使用 apply 或 sapply:

    sapply(seq_len(ncol(new_t)), function(i) 
      cor(x=new_t[,i], method='spearman', y=new_t[,12559]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多