Аномальные записи

#r #data.table

#r #данные.таблица

Вопрос:

У меня есть эти данные.таблица А:

 Person  characteristics1
     A                 1
     A                 1
     A                 2
     A                 1
     A                 1
     A                 1
  

Можно видеть, что в «characteristics1» есть аномальная запись, которая равна 2. Как мне написать функцию, которая сообщала бы, что, поскольку большинство записей в столбце «characteristics1» равно 1, я хочу изменить «2» на «1»?

Большое спасибо

Комментарии:

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

2. Как вы на самом деле узнаете, какое значение является «ненормальным»? Для меня это не выглядит таким уж необычным (опять же, я понятия не имею, что на самом деле представляет characteristics1 «. Вам придется быть немного более конкретным в отношении того, какие именно значения вы хотите изменить. Возможно, предоставьте более надежный пример с вводом и желаемым результатом для этого ввода, который показывает как столбцы / строки, которые вы хотите изменить, так и те, которые вы не хотите.

3. Что произойдет, если это так 1,1,1,2,2,2 ?

4. Или что, если для A есть только два значения: 1,2. Как вы решаете, какая из них правильная?

5. Тогда выбирайте большинство, наиболее частая из них является правильной, и надейтесь, что там нет связей 🙂 … кроме того, некоторые могут счесть оскорбительным тот "Forget about transgender... haha"

Ответ №1:

Вы ищете режим. R не имеет встроенной функции для режима, но вы можете создать функцию для этого:

 library(data.table)
setDT(df)

getmode <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}

df[,characteristics1:=getmode(characteristics1), by=Person]

   Person characteristics1
1:      A                1
2:      A                1
3:      A                1
4:      A                1
5:      A                1
6:      A                1
  

Ответ №2:

На самом деле не знаю, насколько верен ваш способ мышления, но вы можете найти наиболее повторяющееся значение и обновить столбец на его основе с помощью:

 df$characteristics1=names(which.max(table(df$characteristics1)))
  

Оберните деталь справа от = с as.numeric() , если вы работаете только с числами.