R使用sapply作为具有多个输入的函数

时间:2015-08-27 20:54:27

标签: r apply

我无法弄清楚如何为具有多个输入的函数使用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中的每个元素?有没有办法让它只为每一行操作?

1 个答案:

答案 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`
}