1

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方法は何ですか?

ありがとう

4

2 に答える 2

3

ここに別のアプローチがあります。内部で関数を使用できるようにする必要があるため、 and を組み合わせるcombnことで答えが得られます(1つの選択肢のみ:D)FUNcombnmapply

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 に答える