4

R ではapplylapplyrapplydo.call、 などの関数を使用して次のコードをどのように置き換えますか?

u <- 10:12
slist <- list()

for (i in 1:length(u)) {
  p <- combn(u, i) 
  for (j in 1:ncol(p)) {
    s <- paste(p[,j], collapse=",")
    slist[[s]] <- 0
  }
}


この部分について:

  for (j in 1:ncol(p)) {
    s <- paste(p[,j], collapse=",")

私は次のようなものを試しました:

  s <- apply(p, 2, function(x) paste(x, collapse=","))

これは機能します。しかし、slist[[s]] <- 0同じ for ループ内のその部分については、どうすればよいかわかりません。

編集:これが私がやろうとしていることです。vector については、uその vector 内のすべてのサブセットのリストを作成しています。次に、サブセットごとに に割り当てs、その文字列sを の要素の名前として使用しますslist。ちょっと変ですが、宿題用です。上記のコードの場合、これは slist の最初の 5 つの要素になります。

 > slist
 $`10`
 [1] 0

 $`11`
 [1] 0

 $`12`
 [1] 0

 $`10,11`
 [1] 0

 $`10,12`
 [1] 0

ええ、私は apply などを適切に使用する方法を学ぼうとしています。

4

3 に答える 3

4

ここに1つの解決策があります:

n <- unlist(lapply(seq_along(u), function(i) {
  apply(combn(length(u),i),2, function(x) paste(u[x], collapse=','))
}
))

slist <- list()
slist[n] <- 0

更新@djhurio と同時に投稿されましたが、非常に似ていますが、@djhurio が指摘したように、長さ 1 をcombn処理するように自由に使用を変更しました。u

于 2011-11-15T21:30:22.717 に答える
3

applyoneと oneを使用したソリューションlapply。の場合にも機能しますlength(u)==1

# Define function to create combinations
f1 <- function(y, i) {
  if (length(y)==1) as.character(y) else {
    p <- combn(y, i)
    apply(p, 2, function(x) paste(x, collapse=","))
  }
}

# Initial vector
u <- 10:12

# Character vector with all posible combinations
l <- unlist(lapply(1:length(u), f1, y=u))
l

# Create list with 0 values and same length as l
slist <- as.list(rep(0, length(l)))

# Assign names to the list objects
names(slist) <- l

slist
于 2011-11-15T21:29:24.323 に答える
1

匿名関数を必要としない別のソリューション。はをmapplyベクトル化しcombnrapply組み合わせリストを再帰的にトラバースし、 を使用してそれらを折りたたみます,

rapply(mapply(combn, list(u), seq_along(u), simplify = F), paste, collapse = ",")
于 2011-11-15T22:53:44.907 に答える