Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算data.table中几列的z分数的平均值_R_Data.table - Fatal编程技术网

R 计算data.table中几列的z分数的平均值

R 计算data.table中几列的z分数的平均值,r,data.table,R,Data.table,在R中,我有一个数据表和一个带有数据表列名子集的字符向量。我需要计算具有指定名称的每列的z分数(即平均值的标准偏差数),并将z分数的平均值放入新列中。我找到了一个带有显式for循环的解决方案(发布在下面),但这必须是一个足够常见的任务,可以让一些库函数更优雅地完成这项工作。有更好的办法吗 以下是我的解决方案: #! /usr/bin/env RSCRIPT library(data.table) # Sample data table. dt <- data.table(a=1:3,

在R中,我有一个数据表和一个带有数据表列名子集的字符向量。我需要计算具有指定名称的每列的z分数(即平均值的标准偏差数),并将z分数的平均值放入新列中。我找到了一个带有显式for循环的解决方案(发布在下面),但这必须是一个足够常见的任务,可以让一些库函数更优雅地完成这项工作。有更好的办法吗

以下是我的解决方案:

#! /usr/bin/env RSCRIPT

library(data.table)

# Sample data table.
dt <- data.table(a=1:3, b=c(5, 6, 3), c=2:4)

# List of column names.
cols <- c('a', 'b')

# Convert columns to z-scores, and add each to a new list of vectors.
zscores <- list()
for (colIx in 1:length(cols)) {
  zscores[[colIx]] <- scale(dt[,get(cols[colIx])], center=TRUE, scale=TRUE)
}

# Average corresponding entries of each vector of z-scores.
avg <- numeric(nrow(dt))
for (rowIx in 1:nrow(dt)) {
  avg[rowIx] <- mean(sapply(1:length(cols),
                            function(colIx) {zscores[[colIx]][rowIx]}))
}

# Add new vector to the table, and print out the new table.
dt[,d:=avg]
print(dt)

scale
可应用于矩阵(-like)对象,通过

> set(dt, NULL, 'd', rowMeans(scale(dt[, cols, with = F])))
> dt
   a b c           d
1: 1 5 2 -0.39089105
2: 2 6 3  0.43643578
3: 3 3 4 -0.04554473

scale
可应用于矩阵(-like)对象,通过

> set(dt, NULL, 'd', rowMeans(scale(dt[, cols, with = F])))
> dt
   a b c           d
1: 1 5 2 -0.39089105
2: 2 6 3  0.43643578
3: 3 3 4 -0.04554473

“这一定是一项很普通的任务”——嗯,我认为这是非常不规则的。撇开统计运算、每行平均数和其他任务不谈,使用data.frames或data.tables不是一个好主意。无论如何,你可以把代码缩短到
dt[,d2:=Reduce(`+`,lapply(.SD,function(x)c(scale(x))/length(.SD)),.SDcols=cols]
,我想,“这一定是一个很常见的任务”——嗯,我认为它非常不规则。撇开统计运算、每行平均数和其他任务不谈,使用data.frames或data.tables不是一个好主意。无论如何,您可以将代码缩短为
dt[,d2:=Reduce(`+`,lappy(.SD,function(x)c(scale(x))/length(.SD)),.SDcols=cols]
,我想。