我有一个约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)]
?
答案 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