многократное применение 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?

Благодарность


person ricardo    schedule 05.10.2013    source источник


Ответы (2)


Вот еще один подход. combn имеет FUN, чтобы разрешить использование функций внутри, поэтому сочетание combn и mapply даст вам ответ (только один вариант: D)

combn(1:length(LL), 2, function(x)  mapply("-", LL[[x [1]]], LL[[x [2]]]), FALSE)
person Jilber Urbina    schedule 05.10.2013

Может быть проще хранить их в виде матриц, а не в виде списков. Попробуй это:

# 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)
person nograpes    schedule 05.10.2013
comment
Возможно рассмотреть sweep? - person PascalVKooten; 05.10.2013