Удалить строки в зависимости от режима

Данные:

 df <- data.frame("y"= c(rep(100,10), rep(103,10)), "x" = c(rep(1,8),2,2,rep(4,5),7,7, rep(4,3)) )

Для каждого значения у мы ожидаем уникальное значение х. Но в данных у нас есть пара нежелательных значений. Основываясь на режиме, мы можем найти соответствующее значение x для каждого значения y.

Можем ли мы определить номера строк, где есть нежелательное спаривание?

Ожидаемый результат: 9, 10, 16, 17

1 ответ

Мы можем использовать ave сгруппировать по 'y', получить логический индекс элементов в 'x', которые не являются 'Mode', оттуда получить индекс строки с which,

with(df, which(as.logical(ave(x, y, FUN= function(x) x!=Mode(x)))))
#[1]  9 10 16 17

Или, как упомянуто в комментариях @thelatemail, вышесказанное можно сделать компактным

which(with(df, x != ave(x, y, FUN=Mode) )) 

где Mode есть (взято отсюда)

Mode <- function(x) {
  ux <- unique(x)
 ux[which.max(tabulate(match(x, ux)))]
}
Другие вопросы по тегам