Возвращает максимальный и минимальный индекс в зависимости от условий - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь написать функцию, которая будет работать по ходу матрицы и возвращать два вектора, которые содержат номер столбца (x), в котором найдены первый и последний экземпляр 1.Однако есть некоторые условия.Мой реальный набор данных - 7042 строки и 841 столбец.

  1. Если в последнем столбце найдено 1, оба вектора возвращают ncols + 1
  2. Если 1 не встречается, оба вектора должны == 1
  3. Если 1 встречается в строке несколько раз, но разделяется только NA , вернуть максимальное число столбцов + 1
  4. Если 1 встречается в строке несколько раз,но отделяется любым 0 , возвращает максимальное и минимальное номера столбца + 1
  5. Если 1 встречается только один раз в строке, возвращает номер столбца + 1

Используя приведенный ниже примерный набор данных

structure(list(T1 = c(NA, NA, NA, 1L, NA, NA, NA, NA, NA), T2 = c(NA, 
NA, NA, 0L, NA, NA, NA, NA, NA), T3 = c(NA, 3L, 3L, 0L, 3L, NA, 
NA, 3L, 3L), T4 = c(NA, 4L, NA, 0L, 0L, NA, 4L, 0L, 4L), T5 = c(5L, 
5L, 5L, 0L, 0L, NA, 0L, 5L, 0L)), row.names = c(NA, -9L), class = "data.frame")


+----+----+----+----+----+
| T1 | T2 | T3 | T4 | T5 |
+----+----+----+----+----+
| NA | NA | NA | NA | 1  |
| NA | NA | 1  | 1  | 1  |
| NA | NA | 1  | NA | 1  |
| 1  | 0  | 0  | 0  | 0  |
| NA | NA | 1  | 0  | 0  |
| NA | NA | NA | NA | NA |
| NA | NA | NA | 1  | 0  |
| NA | NA | 1  | 0  | 1  |
| NA | NA | 1  | 1  | 0  |
+----+----+----+----+----+

Вектор 1 должен возвращать c(6,6,6,2,4,1,5,6,5), тогда как вектор 2 должен возвращать c(6,6,6,2,4,1,5,4,5)

Моя первая попытка приведена ниже, но это только возвращаетОкончательная позиция, в которой 1 был найден в каждом столбце1 отделяются только NA или 0, а затем изменяют базу возвращаемого результатаd на какие значения их разделяют.

1 Ответ

0 голосов
/ 24 мая 2019

Я думаю, что мог бы решить эту проблему после разговора с коллегой.Мы можем вернуть максимальное число столбцов +1, где встречается 1, и минимальное число столбцов 0. Если нет 1, вернуть 1. Если нулей нет, вернуть значение для 1.

structure(list(T1 = c(NA, NA, NA, 1L, NA, NA, NA, NA, NA), T2 = c(NA, 
NA, NA, 0L, NA, NA, NA, NA, NA), T3 = c(NA, 3L, 3L, 0L, 3L, NA, 
NA, 3L, 3L), T4 = c(NA, 4L, NA, 0L, 0L, NA, 4L, 0L, 4L), T5 = c(5L, 
5L, 5L, 0L, 0L, NA, 0L, 5L, 0L)), row.names = c(NA, -9L), class = "data.frame")

extInd <- function(x) {
  ## check where 1 occurs and return max(x)+1
  pos_1 <- max(which(x == 1), na.rm = TRUE) + 1
  ## if never, return 1
  if (is.infinite(pos_1)) {
    pos_1 <- 1
  }
  ## check where 0 occurs and return first instance
  pos_0 <- min(which(x == 0), na.rm = TRUE)
  ## if never 0, return pos_1
  if (is.infinite(pos_0)) {
    pos_0 <- pos_1
  }
  return(c(pos_1, pos_0))
}

suppressWarnings(t(apply(df, 1, extInd)))
...