【问题标题】:Row operations in data.tabledata.table 中的行操作
【发布时间】:2014-03-06 07:04:56
【问题描述】:

我尝试使用data.table 对行进行简单的求和和均值,但我得到了意想不到的结果。我遵循了FAQ manual 的第 2 节中的帮助,用于 data.table。我找到了一种可行的方法,但我不确定为什么常见问题解答第 2 节中的这种方法不可行。 这种方法给了我不正确的结果(即,它给了我第一列的值):

dt[, genesum:=lapply(.SD,sum), by=gene]
head(dt)

      gene      TCGA_04_1348      TCGA_04_1362   genesum  
  1:    A1BG          0.94565          0.70585  0.94565   
  2: A1BG-AS          0.97610          1.15850  0.97610   
  3:    A1CF          0.00000          0.02105  0.00000   
  4:   A2BP1          0.00300          0.04150  0.00300   
  5:   A2LD1          4.57975          5.02820  4.57975  
  6:     A2M         60.37320         36.09715 60.37320 

这给了我想要的结果

dt[, genesum:=apply(dt[,-1, with=FALSE],1, sum)]
head(dt)

       gene     TCGA_04_1348       TCGA_04_1362 genesum
  1:    A1BG          0.94565          0.70585  1.65150
  2: A1BG-AS          0.97610          1.15850  2.13460
  3:    A1CF          0.00000          0.02105  0.02105
  4:   A2BP1          0.00300          0.04150  0.04450
  5:   A2LD1          4.57975          5.02820  9.60795
  6:     A2M         60.37320         36.09715 96.47035

我有更多的列和行,这只是一个子集。这和我设置key的方式有关系吗?

tables()
 NAME        NROW    MB COLS                                               KEY                                             
 [1,] dt     20,785  2  gene,TCGA_04_1348_01A,TCGA_04_1362_01A,genesum    gene

【问题讨论】:

    标签: r data.table mean


    【解决方案1】:

    一些事情:

    1. dt[, genesum:=lapply(.SD,sum), by=gene]dt[, genesum:=apply(dt[ ,-1],1, sum)] 完全不同。

      • dt[, genesum:=lapply(.SD,sum), by=gene] 循环遍历.SD data.table 的并对它们求和

      • dt[, genesum:=apply(dt[, -1], 1, sum)] 循环遍历行(即apply(x, 1, function)function 应用于x 中的每一行

    2. 我想你可以通过拨打rowSums得到你想要的,就像这样:

      dt[, genesum := rowSums(dt[, -1])]
      

    这就是你所追求的吗?

    【讨论】:

    • 我现在看到了不同之处。效率方面,apply 和 rowSums 没有区别?
    • @sahir:我认为rowSums 应该更快,因为我相信它避免了 R 中的循环,但是如果不是,它也会创建其输入的副本以将其转换为矩阵已经有一个了。
    • 如何编写 rowSums 之类的函数...比如说 rowMedian ?
    • @IndranilGayen:为了避免 R 中的循环,您将不得不用 C/C++ 编写它。看看matrixStats 包,它提供了许多这样的 row* 和 col* 操作,并且它们通过委托给 C 来快速运行。(我链接到 github 而不是 CRAN,因此您可以更轻松地浏览 tis 源代码代码)
    【解决方案2】:

    这是另一种选择 (based on this SO question):

    dt[ ,  genesum := sum(.SD[, -1, with=FALSE]), by = 1:NROW(dt) ]
    

    另一种选择:

    # OR... you can create a column with row positions and apply your function by row
    dt[, rowpos := .I]
    dt[ ,  genesum := sum(.SD[, -1, with=FALSE]), by = rowpos]
    

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多