-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: 在 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 循环中增长对象,预先分配然后填充。

避免使用函数名称命名对象(例如cormatrixlist

于 2012-10-31T00:08:20.343 回答