检查每行是否有东西(行长度> 1)

时间:2012-10-30 23:59:24

标签: r loops for-loop

基本上我有一个矩阵和一行,其中有一个我想在列表中附加一个“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 if(matrix [i,]%in%“A”){:

     

条件的长度> 1,只使用第一个元素

问题是如何克服这个目标以实现目标

2 个答案:

答案 0 :(得分: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中函数的名称。

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

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