Удалять повторяющиеся наблюдения на основе набора правил
Я пытаюсь удалить повторяющиеся наблюдения из набора данных на основе моей переменной id. Однако я хочу, чтобы удаление наблюдений основывалось на следующих правилах. Переменные ниже - это id, пол главы домохозяйства (1-мужчина, 2-женщина) и возраст главы домашнего хозяйства. Правила заключаются в следующем. Если в домохозяйстве есть главы мужского и женского домохозяйств, удалите наблюдение за домашними хозяйствами женщин. Если домашнее хозяйство как две мужские или две женские головы, удалите наблюдение с младшей головкой домашнего хозяйства. Ниже приведен пример набора данных.
id = c(1,2,2,3,4,5,5,6,7,8,8,9,10)
sex = c(1,1,2,1,2,2,2,1,1,1,1,2,1)
age = c(32,34,54,23,32,56,67,45,51,43,35,80,45)
data = data.frame(cbind(id,sex,age))
Ответы
Ответ 1
Вы можете сделать это, предварительно заказав data.frame
, чтобы первая запись для каждого id
была первой, а затем удалите строки с дубликатом id
s.
d <- with(data, data[order(id, sex, -age),])
# id sex age
# 1 1 1 32
# 2 2 1 34
# 3 2 2 54
# 4 3 1 23
# 5 4 2 32
# 7 5 2 67
# 6 5 2 56
# 8 6 1 45
# 9 7 1 51
# 10 8 1 43
# 11 8 1 35
# 12 9 2 80
# 13 10 1 45
d[!duplicated(d$id), ]
# id sex age
# 1 1 1 32
# 2 2 1 34
# 4 3 1 23
# 5 4 2 32
# 7 5 2 67
# 8 6 1 45
# 9 7 1 51
# 10 8 1 43
# 12 9 2 80
# 13 10 1 45
Ответ 2
С data.table
это легко с помощью "сложных запросов". Чтобы заказать данные, когда вы его прочитали, установите "ключ", когда вы читаете его как "id, sex" (требуется в случае, если какие-либо женские значения придут до мужских значений для данного идентификатора).
> library(data.table)
> DT <- data.table(data, key = "id,sex")
> DT[, max(age), by = key(DT)][!duplicated(id)]
id sex V1
1: 1 1 32
2: 2 1 34
3: 3 1 23
4: 4 2 32
5: 5 2 67
6: 6 1 45
7: 7 1 51
8: 8 1 43
9: 9 2 80
10: 10 1 45