簡體   English   中英

mapply的多重應用

[英]multiple application of mapply

是否有mapply高階版本,以便它會遍歷列表並找出每個子組件之間的差異?

我有一個包含子列表的列表LL ,我想找到每個子列表之間的差異。 如果我單獨進行操作,則將執行以下操作。

mapply("-", LL[[1]], LL[[2]])
mapply("-", LL[[1]], LL[[3]])
mapply("-", LL[[2]], LL[[3]])

目前,我正在使用以下方法-但感覺像是一種破解( 功能不完善)。

set.seed(1)
x1 = 1:5
x2 = 5:1
x3 = seq(2, 10, 2)
xl <- list(x1, x2, x3)
y1 = rnorm(5)
y2 = runif(5)
y3 = seq(20, 12, -2)
yl <- list(y1, y2, y3)
z1 = rnorm(5)
z2 = runif(5)
z3 = seq(20, 12, -2) %% 3
zl <- list(z1, z2, z3)
LL <- list(xl, yl, zl)

LLdiff <- list()
combs <- combn(1:length(LL), 2)
for (i in 1:ncol(combs)) {
    LLdiff[[i]] <- mapply("-", LL[[combs[,i][1]]], LL[[combs[,i][2]]])
}

R / functional方式是什么?

謝謝

這是另一種方法。 combn具有FUN允許在內部使用函數,因此結合combnmapply將為您提供答案(只是一種替代方法:D)

combn(1:length(LL), 2, function(x)  mapply("-", LL[[x [1]]], LL[[x [2]]]), FALSE)

將它們存儲為矩陣而不是列表列表可能會更容易。 嘗試這個:

# Convert to matrices.
new.LL<-lapply(seq_along(LL),function(f)do.call(cbind,LL[[f]]))
# Loop over each combo
lapply(apply(combn(1:length(new.LL),2),2,
  function(x) new.LL[x]),function(x) x[[1]]-x[[2]])

另一種更具吸引力的策略:

combos<-combn(1:length(new.LL),2)
mapply(`-`, new.LL[combos[1,]],new.LL[combos[2,]],SIMPLIFY=FALSE)

暫無
暫無

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

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