[英]passing more than one argument to FUN of lapply
我的問題基於另一個類似的問題: 將幾個參數傳遞給lapply(和其他* apply)的FUN
我有一個自定義函數來創建一個data.frame
。 目標是為每個新的輸入變量檢索data.frames
列表(我想對幾個輸入變量進行循環以創建新的data.frames
)。
如果只更改一個輸入變量,我設法做到了:
fn <- function(a, b){
data.frame(res = c(a, b, a + b),
text = c("a", "b", "total"))
}
fn(1, 2)
#> res text
#> 1 1 a
#> 2 2 b
#> 3 3 total
lapply(1:3, FUN = fn, b = 1)
#> [[1]]
#> res text
#> 1 1 a
#> 2 1 b
#> 3 2 total
#>
#> [[2]]
#> res text
#> 1 2 a
#> 2 1 b
#> 3 3 total
#>
#> [[3]]
#> res text
#> 1 3 a
#> 2 1 b
#> 3 4 total
但是,一旦我也更改了第二個輸入變量(b),就會收到一條錯誤消息。
lapply(1:3, FUN = fn, b = 1:3)
data.frame中的錯誤(res = c(a,b,a + b),text = c(“ a”,“ b”,“ total”))):參數暗示行數不同:7,3
上面的問題(請參閱鏈接)中建議的方法是使用mapply
。 這有效,但是返回一個matrix
,我將其解釋為列表列表(如果我錯了,請更正我)。
x <- mapply(fn, b = 1:3, a = 1:3)
x
#> [,1] [,2] [,3]
#> res Integer,3 Integer,3 Integer,3
#> text factor,3 factor,3 factor,3
為了得到想要的data.frames
列表,我可以再次使用apply
:
apply(x, 2, data.frame)
#> [[1]]
#> res text
#> 1 1 a
#> 2 1 b
#> 3 2 total
#>
#> [[2]]
#> res text
#> 1 2 a
#> 2 2 b
#> 3 4 total
#>
#> [[3]]
#> res text
#> 1 3 a
#> 2 3 b
#> 3 6 total
由reprex軟件包 (v0.2.1)創建於2019-05-22
問題 :有沒有一種方法可以避免mapply
然后在自定義函數中apply
多個輸入變量?
你可以做:
library(purrr)
map2(1:3, 1:3, fn)
[[1]]
res text
1 1 a
2 1 b
3 2 total
[[2]]
res text
1 2 a
2 2 b
3 4 total
[[3]]
res text
1 3 a
2 3 b
3 6 total
如果您想堅持地圖繪制,可以執行以下操作:
x <- mapply(fn, b = 1:3, a = 1:3, SIMPLIFY = F)
要么
x <- Map(fn, b = 1:3, a = 1:3)
這是SIMPLIFY = F
mapply的包裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.