Положение первого вхождения в каждом ряду в соответствии с условием - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующая таблица с упорядоченными переменными:

table <- data.frame(Ident = c("Id_01", "Id_02", "Id_03", "Id_04", "Id_05", "Id_06"), 
                    X01 = c(NA, 18, 0, 14, 0, NA), 
                    X02 = c(0, 16, 0, 17, 0, 53), 
                    X03 = c(NA, 15, 20, 30, 0, 72), 
                    X04 = c(0, 17, 0, 19, 0, NA), 
                    X05 = c(NA, 29, 21, 23, 0, 73), 
                    X06 = c(0, 36, 22, 19, 0, 55))

Ident   X01 X02 X03 X04 X05 X06
Id_01   NA  0   NA  0   NA  0
Id_02   18  16  15  17  29  36
Id_03   0   0   20  0   21  22
Id_04   14  17  30  19  23  19
Id_05   0   0   0   0   0   0
Id_06   NA  53  72  NA  73  55

Я хотел бы найти для каждого идентификатора, когда первый случай появляется в соответствии с определенным условием.Например, два последовательных числа> 0:

Для Id_01: никогда не происходит (NA?)

Для Id_02: 1-я позиция (X01)

Для Id_03: 5-я позиция (X05)

Для Id_04: 1-я позиция (X01)

Для Id_05: никогда не происходит (NA?)

Для Id_06: 2-яposition (X02)

Я пытаюсь найти номер позиции ИЛИ имя переменной этой позиции.


РЕДАКТИРОВАТЬ: я ищу, чтобы добавить второе условиек решению apply, опубликованному ниже, поэтому условия должны быть следующими:

  1. 1-е и 2-е вхождение (последовательное)> 0 ИЛИ

  2. 1-е и 3-е вхождение> 0

Учитывая это изменение, результат оценки для таблицы, опубликованной ранее, должен быть:

Для Id_01: никогда не происходит (NA?)

Для Id_02: 1-я позиция (X01)

Для Id_03: 3-я позиция (X03) - не X05

Для Id_04: 1-я позиция (X01)

For Id_05: никогда не возникает (NA?)

Для Id_06: 2-я позиция (X02)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Один путь для имени переменной этой позиции:

library(magrittr)
apply(!is.na(table[-1]) & table[-1] > 0, 1, 
      function(x) ave(x, cumsum(x == 0), FUN = cumsum)) %>%
  apply(2, function(x) names(table)[which(x == 2)[1]])

[1] NA    "X01" "X05" "X01" NA    "X02"

Или индексы:

apply(!is.na(table[-1]) & table[-1] > 0, 1, 
      function(x) ave(x, cumsum(x == 0), FUN = cumsum)) %>%
  apply(2, function(x) which(x == 2)[1] - 1L)

[1] NA  1  5  1 NA  2
0 голосов
/ 03 октября 2018

Мы можем использовать apply для циклического перемещения по строкам, создания логического выражения, которое проверяет, являются ли числа больше 0 или нет NA ('i1').Затем сравните два соседних элемента, удалив первый и последний элемент iechecking для двух TRUE, и получите индекс с which.Используйте это, чтобы получить имена столбцов

apply(table[-1], 1, function(x) {
    i1 <- x > 0 & !is.na(x)
    names(x)[which(i1[-1] & i1[-length(i1)])[1]]})
#[1] NA    "X01" "X05" "X01" NA    "X02"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...