【问题标题】:Check if something is in each row (row length>1)检查每一行是否有东西(行长> 1)
【发布时间】:2012-10-30 23:59:23
【问题描述】:

基本上我有一个矩阵和行,我想在列表中附加一个“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 并且只使用第一个元素

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

【问题讨论】:

  • 你为什么不使用 ifelse?你也有 %in% 倒退。

标签: r loops for-loop


【解决方案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

【讨论】:

    【解决方案2】:

    您的意思是测试"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-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2012-05-11
      相关资源
      最近更新 更多