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
processksdw适用于此示例,但我的数据集很大。@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