[英]mapply multiple undefined arguments
假設您有一個未定義的列表nr作為函數的可能參數,例如可以選擇以下3個(此示例盡可能簡單,因此矢量存儲在列表中):
a <- list(c(1,2,3,4,5))
b <- list(c(3,6,7,2,1))
c <- list(c(3,9,8))
如果要計算所有三個列表的交集,可以按以下步驟進行:
Map(intersect,c,Map(intersect,a,b))
# or equivalent:
mapply(intersect,c,mapply(intersect,a,b,SIMPLIFY=F))
# [1] 3
但是,如何將參數的nr更改為undefined? 我讀到有關...
,但無法使它正常工作。 第一個想法是編寫一個函數,該函數可以具有由...
定義的多個列表參數:
intersectio <- function(...){
Map(function(...){
intersect(...)
})
}
問:但這當然不起作用,因為相交必須遞歸應用。 有什么辦法可以在R中做到這一點嗎?
問題2:這是帶有嵌套列表結構的更新示例。 在這種情況下,如何做到這一點,即將父列表的每個子列表與其他父列表的關聯子列表(相同索引)相交?
a <- list(list(c(1,2,3,4,5)),list(c(3,6,7,2,1)),list(c(3,9,8)))
b <- list(list(c(1,2)),list(c(3,6,9,11,12)),list(c(3)))
c <- list(list(c(1,9)),list(c(65,23,12)),list(c(14,15)))
如@Roland所建議,您可以使用Reduce
解決您的問題。 對於平面列表(如問題的第一個版本),可以使用以下內容:
Reduce(intersect, c(a, b, c))
對於嵌套列表(如更新的問題),您只需要將其包裝在mapply
調用中:
mapply(function(...) Reduce(intersect, c(...)), a, b, c)
概括地說,您可以定義一個函數,然后根據需要調用任意數量的參數。
list_intersect <- function(...){
mapply(function(...) Reduce(intersect, c(...)), ...)
}
list_intersect(a, b, c)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.