data.table中的行操作

时间:2014-02-08 21:22:08

标签: r data.table mean

我尝试使用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

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

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

2 个答案:

答案 0 :(得分:3)

一些事情:

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

    • dt[, genesum:=lapply(.SD,sum), by=gene]遍历.SD data.table的并将它们相加

    • dt[, genesum:=apply(dt[,-1, with=FALSE],1, sum)]循环播放行(即。apply(x, 1, function)function应用于x

    • 中的每一行
  2. 我认为你可以通过调用rowSums得到你想要的东西,如下:

    dt[, genesum := rowSums(dt[, -1, with=FALSE])]
    
  3. 这就是你要追求的吗?

答案 1 :(得分:1)

以下是另一种选择(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]