Как бы я получить положение первого вхождения значения 0 в ряде двоичных матриц в R? - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь получить позицию первого вхождения значения 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) должен иметь положительную длину'...

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)

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Вот несколько способов получить индексы строк и столбцов первой записи в строке, равной 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])
0 голосов
/ 13 октября 2019

Это некрасиво, но я думаю, что это то, что вы ищете:

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)})})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...