簡體   English   中英

在 R 中的列表中映射元素對

[英]mapply on pairs of elements in a lists in R

如果我有一個對稱二元運算符要應用於列表中的元素對,是否有一種簡單的方法可以在 R 中執行此操作? 我試過:

A <- list(1,2,3)
mapply(function(x,y) x+y, A,A)

但這只會為所有n=1..N給出x[n]+y[n]但我想要x[n]+y[m]對於所有m=1..n, n=1..N返回為一個列表。 outer(..)m=1..N, n=1..N這樣做,這涉及冗余計算,所以我想打折扣。

請注意,我不想要這個簡單示例的解決方案。 我需要一個適用於非數字輸入的通用解決方案。 我想做的事情是:

mapply(function(set_1, set_2) intersect(set_1, set_2), list_of_sets, list_of_sets)

在這兩種情況下,加法和交集都是對稱的。 在第一個示例中,我希望list(3,4,5)來自list(1+2,1+3,2+3)

您可以使用outer -

values <- c(1, 2, 3)
outer(values, values, `+`)

#     [,1] [,2] [,3]
#[1,]    2    3    4
#[2,]    3    4    5
#[3,]    4    5    6

outer也適用於非數字輸入。 如果您要應用的函數不是矢量化的,您可以使用Vectorize 由於 OP 沒有提供示例,因此我創建了自己的示例。

list_of_sets_1 <- list(c('a', 'b', 'c'), c('a'))
list_of_sets_2 <- list(c('a', 'c'), c('a', 'b'))

fun <- function(x, y) intersect(x, y)
result <- outer(list_of_sets_1, list_of_sets_2, Vectorize(fun))
result

我們需要combn來做沒有冗余的成對計算

combn(A, 2, FUN = function(x) x[[1]] + x[[2]], simplify = FALSE)

-輸出

[[1]]
[1] 3

[[2]]
[1] 4

[[3]]
[1] 5

這也適用於非數字元素

list_of_sets <- list(c('a', 'b', 'c'), "a", c("a", "c"))
combn(list_of_sets, 2, FUN = function(x) Reduce(intersect, x), simplify = FALSE)

-輸出

[[1]]
[1] "a"

[[2]]
[1] "a" "c"

[[3]]
[1] "a"

暫無
暫無

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

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