пометить строку во фрейме данных как TRUE, если появляется определенное число внутри группы

Я задавал вам аналогичный вопрос раньше, а теперь изменить его наоборот? Я хотел бы найти строки внутри групп, в которых определенное число появляется в последний раз, но если это число не появляется в группе, будет использоваться следующее наибольшее число.

Данные выглядят так:

group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
value <- c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2)
dat <- data.frame(group, value)
dat

Сначала я хотел бы найти, имеет ли группа значение 3, и если да, то строка с последним номером 3 в группе помечена как «ИСТИНА», если в группе нет номера 3, тогда ищите первый номер 2 и так далее. В конце каждой группы есть только одно «ИСТИНА». Таким образом, столбец «РЕЗУЛЬТАТ» должен быть результатом моего вопроса. Я надеюсь, что на этот раз вопрос более понятен, и заранее благодарю вас.

Ожидаемый результат:

 group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
 value <- c(1, 3, 3, 1, 1, 1, 2, 1, 2, 3, 3, 2)
 RESULT <- c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE")
 target <- data.frame(group, value, RESULT)
 target

person Eco06    schedule 29.03.2013    source источник


Ответы (2)


Ну вот.

f <- function(v) replace(logical(length(v)), 
                         which(v == max(v) & !duplicated(v, fromLast=TRUE)), 
                         TRUE)
transform(dat, GOAL=as.logical(ave(value, group, FUN=f)))
#    group value  GOAL
# 1      a     1 FALSE
# 2      a     3  TRUE
# 3      a     2 FALSE
# 4      a     1 FALSE
# 5      b     1 FALSE
# 6      b     1 FALSE
# 7      b     2  TRUE
# 8      b     1 FALSE
# 9      c     2 FALSE
# 10     c     3 FALSE
# 11     c     3  TRUE
# 12     c     2 FALSE
person Matthew Plourde    schedule 29.03.2013

Я бы сделал:

is.first.max <- function(x) seq_along(x) == which.max(x)
is.last.max  <- function(x) rev(is.first.max(rev(x)))
transform(dat, RESULT = as.logical(ave(value, group, FUN = is.last.max)))
person flodel    schedule 29.03.2013