Удалить строки в зависимости от режима
Данные:
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)))]
}