【问题标题】:How would I get the position of the first occurrence of a value 0 in a number of binary matrices in R?如何在 R 中的多个二进制矩阵中获得第一次出现值 0 的位置?
【发布时间】:2019-10-13 09:14:28
【问题描述】:

我正在尝试获取值 0 在通过多个 csv 文件读取的多个二进制矩阵中第一次出现的位置。

我已经使用...得到了 0 的数量

sapply(files_to_use, function(x) sum(x == 0))

使用...读取所有 csv 文件后

reading_in_csv <- list.files(pattern="*.csv")
files_to_use <- lapply(reading_in_csv, read.delim)

我尝试了以下代码,但收到错误“dim(X) must have a positive length”...

find_first_0 <- function(x){which(x = 0)}
apply(files,1,find_first_0)

有人对上述内容有任何见解吗?我正在考虑使用 which() 来获取位置的函数,但我不了解如何一次使用多个矩阵来实现它。

给定示例矩阵...

dimMat <- matrix(0, 1000, 10)

for(i in 1:1000){
  dimMat[i, ] <- sample(c(0,1), 10, replace = TRUE, prob = c(.3, .7))
}

print(dimMat)

【问题讨论】:

  • 只是你用了apply而不是sapply
  • 提供您的dimMat,您的预期输出是多少?另外,请在for 循环之前set.seed(123),以便它可以重现。
  • 这里真正的问题是该列表也有 0 暗淡的对象。下面的代码解决了这个问题,并产生了一个无警告的逐行搜索来查找 0 值,并将结果作为向量输出: delete_empty_matrices 0, suppressWarnings(min (其中(y == 0))), NA)})})

标签: r binary-matrix


【解决方案1】:

这很丑,但我认为这就是你所追求的:

delete_empty_matrices  <-  function(matrix_list){   
  matrix_list[unlist(lapply(matrix_list, length) != 0)]
}

files_to_use <- files_to_use[!(is.na(delete_empty_matrices(files_to_use)))]

sapply(files_to_use, function(x){apply(x, 1, function(y){ifelse(length(y) > 0,
                                                                suppressWarnings(min(which(y == 0))), NA)})})

【讨论】:

  • 在我的回答中给出了一个示例矩阵,我已经尝试过了,但我不确定结果。我得到所有 0 的位置,但只想要第一个 0 的位置。
  • 我也尝试通过读取一个二进制矩阵 csv 文件并得到以下输出... $X0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 .0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 整数(0)
  • 你是正确的道歉请尝试:find_first_0
  • 我收到以下错误... dim(X) 的长度必须为正
  • 这行得通吗?应用(dimMat,2,函数(x){ifelse(长度(x)> 0,min(其中(x == 0)),NA)})
【解决方案2】:

这里有几种方法可以获取每行第一条记录的行和列索引,即 0。

aggregate(col ~ row,
          data = which(dimMat == 0, arr.ind = T),
          FUN = function(x) x[1])

complete_rows <- rowSums(dimMat) < ncol(dimMat)

cbind(row = seq_len(nrow(dimMat))[complete_rows],
      col = apply(dimMat == 0, 1, which.max)[complete_rows])

要找到每列的第一条记录,它是 0,这将非常相似:

aggregate(row ~ col,
          data = which(dimMat == 0, arr.ind = T),
          FUN = function(x) x[1])

complete_cols <- colSums(dimMat) < nrow(dimMat)

cbind(col = seq_len(ncol(dimMat))[complete_cols],
      row = apply(dimMat == 0, 2, which.max)[complete_cols])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2021-07-13
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2018-01-21
    相关资源
    最近更新 更多