Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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 为数据集按行应用函数_R - Fatal编程技术网

R 为数据集按行应用函数

R 为数据集按行应用函数,r,R,希望我能清楚地解释我想做什么 means<-apply(onlyABC,1,rowMeans) 我有一个矩阵 Z<-matrix(sample(1:40),ncol=4) colnames(Z)<-c("value","A","B","C") I would like to apply the following formula to each row in the dataset. Process = value - rowmean (A,B,

希望我能清楚地解释我想做什么

     means<-apply(onlyABC,1,rowMeans)
我有一个矩阵

  Z<-matrix(sample(1:40),ncol=4)

 colnames(Z)<-c("value","A","B","C")

 I would like to apply the following formula to each row in the dataset.


  Process = value - rowmean (A,B,C)
           ------------------------------------
           row-wise Standard deviation (A,B,C)         
     means<-apply(onlyABC,1,rowMeans)

同样地,也将公式应用于其他行,最后得到一个大小为10的向量。

这不是一个应用问题,因为您希望从计算中排除每行的第一列

     means<-apply(onlyABC,1,rowMeans)
执行此操作的迭代方法是首先创建输出向量,然后将其替换为以下内容:

     means<-apply(onlyABC,1,rowMeans)
tranZ <- vector('numeric', length = nrow(Z))
for (i in 1:nrow(Z)) {
    tranZ[i] <- (Z[i,1] - mean(Z[i,-1])) / sd(Z[i,-1])
}
或使用
vapply

     means<-apply(onlyABC,1,rowMeans)
tranZ_v <- vapply(1:nrow(Z), function(X) (Z[X, 1] - mean(Z[X, -1])) / sd(Z[X, -1]),
                FUN.VALUE = numeric(1))
使用仅适用于
sd
的矢量化方法最快:

     means<-apply(onlyABC,1,rowMeans)
> bb
           test elapsed relative
3    apply_sd()   0.021    1.000
4 vapply_anon()   0.030    1.429
1   apply_fun()   0.033    1.571
2  apply_fun2()   0.034    1.619

process
ksdw适用于此示例,但我的数据集很大。@Paul如果速度是个问题,那么您应该在问题中提到。现在,你为什么不把所有的答案都拿出来,运行一个基准测试,比较不同的时间安排呢?(您可以使用
microbenchmark
)注意,此函数有一个错误并给出错误的结果。它缺少一个参数:它应该是
过程您以正确且可能最快的方式(使用
矩阵
数据帧
)完成了所有操作。一旦你有了
意味着
偏离
,只要做
(Z[,1]-意味着)/偏离
。此类操作在R中矢量化。请参阅度量的答案。
process <- function(x) {
    (x[["value"]] - mean(c(x[["A"]], x[["B"]], x[["C"]])) / sd(c(x[["A"]], x[["B"]], x[["C"]])))
}           

apply(Z, 1, process)
ksd<-apply(Z[,-1],1,sd)
kmean<-rowMeans(Z[,-1])
 Z[,1]<-(Z[,1]-kmean)/ksd
> Z
            value  A  B  C
 [1,]  0.88181533 26  4 31
 [2,] -0.04364358 17 22  7
 [3,]  2.21200505 25 13 18
 [4,]  0.50951017  8 34 40
 [5,]  0.03866223 12  6 23
 [6,] -0.64018440 29 16 30
 [7,] -0.40927275 39 35  9
 [8,] -0.65103077 24  5  1
 [9,]  0.89658092 37 27  3
[10,]  0.26360896 11 10 28