-1

基本的に、リストに「1」を追加したいマトリックスと行があります。それ以外の場合は「0」を追加します。

コードは次のとおりです。

is.there.A <- function(a,b,c,d,e) {

  library(combinat)
  x <- c(a,b,c,d,e)  
  matrix <- matrix(combn(x,3), ncol=3, byrow=T) 
  row <- nrow(matrix)
  list <- list()
  
  for (i in seq(row)) {

    if (matrix[i,] %in% "A") {c(list, "1")}

    else {c(list, "0")} 

    print(list)

    }

}

しかし、それは機能せず、これが現れます。

警告メッセージ:

1:In if(matrix [i、]%in% "A"){:

条件の長さは1より大きいため、最初の要素のみが使用されます

問題は、目的を達成するためにこれをどのように克服するかです

4

2 に答える 2

1

をテストするつもり"A" %in% matrix[i,]でしたが、その逆ではありません。ただし、

row <- nrow(matrix)
list <- list()
for (i in seq(row)) {
   if ("A" %in% matrix[i,]) {c(list, "1")}
   else {c(list, "0")}
}

書き換え可能

rowSums(matrix == "A") > 0 

関数に最も適した出力である論理 (TRUE/FALSE) のベクトルを返します。ただし、「1」または「0」のリストが本当に必要な場合は、次のようにラップできます。

as.list(ifelse(rowSums(matrix == "A") > 0, "1", "0"))

matrixまた、R では関数の名前でもあるため、オブジェクトに名前を付けることは悪い考えであることに注意してください。

于 2012-10-31T00:05:57.250 に答える
1

を使用して明示的なループを回避できますapply

is.there.A <- function(a,b,s,d,e) {

  library(combinat)
  x <- c(a,b,s,d,e)  
  .matrix <- matrix(combn(x,3), ncol=3, byrow=T) 

  any_A <- apply(.matrix, 1, `%in%`, x = 'A')
  as.list(as.numeric(any_A))

}

for ループ内でオブジェクトを大きくしないでください。事前に割り当ててから埋めてください。

オブジェクトに関数名を付けることは避けてください (例:cまたはmatrixまたはlist) 。

于 2012-10-31T00:08:20.343 に答える