子集data.table列用于计算新值但保留所有旧列+新值

时间:2016-06-06 20:30:45

标签: r data.table

  1. 我很难说出问题的标题,所以如果有人能提出更准确的标题,我将不胜感激。
  2. 我有一个约100个样本的矩阵,读数在~200,000个特定位置。位置是字符串标识符,样本读数是数字。示例数据:

    library(data.table)
    str_col = c("str1", "str2", "str3")
    s1 = c(54.4, 19.0, 89.0)
    s2 = c(46.6, 39.5, 85.2)
    s3 = c(12.3, 0.2, 55.8)
    
    dt = data.table(str_col, s1, s2, s3)
    dt
       str_col   s1   s2   s3
    1:    str1 54.4 46.6 12.3
    2:    str2 19.0 39.5  0.2
    3:    str3 89.0 85.2 55.8
    

    我想计算样本列(s1-s3)的每个位置(行)的读数的标准偏差,同时省略位置标识符str_col

    我的尝试是:

    dt[, -1, with=FALSE][, stdv := apply(.SD, 1, sd)]
    dt
       str_col   s1   s2   s3
    1:    str1 54.4 46.6 12.3
    2:    str2 19.0 39.5  0.2
    3:    str3 89.0 85.2 55.8
    

    然而,正如您所看到的,这只返回了原始data.table。

    我可以按照以下步骤进行我想要的操作:

    dt_str_col = dt[,.(str_col)]
    dt2 = dt[, -1, with=FALSE][, stdv := apply(.SD, 1, sd)]
    dt3 = data.table(dt_str_col, dt2)
    dt3
       str_col   s1   s2   s3     stdv
    1:    str1 54.4 46.6 12.3 22.39695
    2:    str2 19.0 39.5  0.2 19.65613
    3:    str3 89.0 85.2 55.8 18.17067
    

    但是我想知道是否有办法通过data.table中的引用来实现这一点,类似于我的第一次尝试dt[, -1, with=FALSE][, stdv := apply(.SD, 1, sd)]

2 个答案:

答案 0 :(得分:4)

我相信这会解决你的问题,不会吗?

dt[ ,  sdd := sd(.SD), by = str_col]

dt
#>    str_col   s1   s2   s3  sdd
#> 1:    str1 54.4 46.6 12.3 22.4
#> 2:    str2 19.0 39.5  0.2 19.7
#> 3:    str3 89.0 85.2 55.8 18.2

如果每个str_cols有多行(即你真的想按行计算标准偏差),你可以这样做:

# create a column with row positions
dt[, rowpos := .I]

dt[ ,  sdd := sd(.SD[, -1, with=FALSE]), by = rowpos]

答案 1 :(得分:0)

我不熟悉data.table包,但这可以使用数据框一步完成:

dt = data.frame(str_col, s1, s2, s3)
dt

dt$stdv <- apply(dt[,c(2:4)], 1, FUN = sd)
dt

  str_col  s1   s2   s3     stdv
1    str1 54.4 46.6 12.3 22.39695
2    str2 19.0 39.5  0.2 19.65613
3    str3 89.0 85.2 55.8 18.17067