1

是否有更高阶的版本mapply,这样它将遍历列表并找到每个子组件之间的差异?

我有一个LL包含子列表的列表,我想找出每个子列表之间的差异。如果我单独做,我会做以下事情。

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

目前我正在使用下面的方法——但感觉就像一个 hack(它不是很实用)。

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方式是什么?

谢谢

4

2 回答 2

3

这是另一种方法。combn必须FUN允许在内部使用函数,所以结合起来combn会给mapply你答案(只有一种选择:D)

combn(1:length(LL), 2, function(x)  mapply("-", LL[[x [1]]], LL[[x [2]]]), FALSE)
于 2013-10-05T15:07:28.740 回答
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)
于 2013-10-05T08:29:43.907 回答