我无法弄清楚如何为具有多个输入的函数使用sapply。
如果我有一个向量和两个矩阵,我想一次将向量和矩阵的一行输入到函数中:
A<-cbind(1000, 1000, 4000, 1333, 2333, 2333)
B<-cbind(rnorm(100), rnorm(100), rnorm(100), rnorm(100),rnorm(100), rnorm(100))
C<-cbind(rep(1, 100), rep(2, 100), rep(3, 100), rep(4, 100),rep(5, 100),rep(6, 100))
myFunc <- function(A, B, C) {
X<-A * (B - C)
#X[which(X<0)]=0
return(sum(X))
}
所以,我应该从这个操作中得到100个向量的向量。
我想我不太了解这些结构。我在变量上使用class()
,发现A是矩阵(1x6),B是矩阵(20,000x6),C是数据帧(2x6但我只发送第一行)。当我使用mapply(myFunc,A,B,C)时,我实际得到一个结果,但它是一个120k行的列,而不是像我期待的那样20k
mapply
是否将我的函数应用于B中的每个元素?有没有办法让它只为每一行操作?
答案 0 :(得分:2)
您正在将矢量索引与矩阵列索引混合,因此对矢量项使用seq_along并引用矩阵中的列号。我不认为有任何R功能可以为这个目标读懂你的想法。
A<-cbind(1000, 1000, 4000, 1333, 2333, 2333)
B<-cbind(rnorm(100), rnorm(100), rnorm(100), rnorm(100),rnorm(100), rnorm(100))
C<-cbind(rep(1, 100), rep(2, 100), rep(3, 100), rep(4, 100),rep(5, 100),rep(6, 100))
myFunc <- function(A, B, C) { X <- matrix(NA, nrow(B), ncol(B) )
for (i in seq_along(A) ){
X[, i] <- A[i] * (B[, i] - C[,i])}
X[ which(X<0)] = 0
X # if you do not want to collapse to single number, do NOT use `sum`
}