簡體   English   中英

將函數族應用於具有多個參數的函數

[英]Apply family of functions for functions with multiple arguments

我想使用來自Apply系列(在R中)的函數將兩個參數的函數應用於兩個矩陣。 我認為這是可能的。 我對么? 否則,似乎必須將兩個矩陣合為一,並根據新矩陣重新定義函數。

這是我想做的事的一個例子:

a <- matrix(1:6,nrow = 3,ncol = 2)
b <- matrix(7:12,nrow = 3,ncol = 2)

foo <- function(vec1,vec2){
    d <- sample(vec1,1)
    f <- sample(vec2,1)
    result <- c(d,f)
return(result)
}

我想將foo應用於ab

(嚴格回答問題,而不是在這里為您的特定使用指出更好的方法。)

mapply*apply函數族中的函數,用於在循環多個參數時應用函數。

因此,您要在此處執行的操作是將每個矩陣轉換為包含其行或列(未指定)的向量列表。 有很多方法可以做到這一點,我喜歡使用以下功能:

split.array.along <- function(X, MARGIN) {
    require(abind)
    lapply(seq_len(dim(X)[MARGIN]), asub, x = X, dims = MARGIN)
}

然后,您要做的就是運行:

mapply(foo, split.array.along(a, 1),
            split.array.along(b, 1))

sapply一樣, mapply嘗試將您的輸出放入數組中。 相反,如果您更希望輸出為列表,則將SIMPLIFY = FALSE添加到mapply調用,或者等效地,使用Map function:

Map(foo, split.array.along(a, 1),
         split.array.along(b, 1))

您可以將foo調整為采用一個參數(單個矩陣),然后在函數主體中使用apply
然后,您可以對foo使用lapply從每個矩陣的每一列進行采樣。

> a <- matrix(1:6,nrow = 3,ncol = 2)
> b <- matrix(7:12,nrow = 3,ncol = 2)

> foo <- function(x){
    apply(x, 2, function(z) sample(z, 1))
  }

> lapply(list(a, b), foo)

## [[1]]
## [1] 1 6

## [[2]]
## [1]  8 12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM