2013-10-05 18 views
1

是否有更高版本的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方式?

感謝

回答

3

這裏的另一種方法。 combnFUN以允許使用內部函數,所以結合combnmapply會給你答案(只有一個選擇:d)

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

如矩陣,而不是列出的清單可能更容易存儲這些。試試這個:

# 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) 
+0

也許考慮'sweep'? – PascalVKooten

+1

@Dualinity請以掃描示例爲答案? – ricardo