#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()
, если вы работаете только с числами.