Проверьте, есть ли для каждого уникального значения var1 одно наблюдение, где его значение равно либо var2, либо var3 по группе (var4) в R - PullRequest
1 голос
/ 22 февраля 2020

Думаю, у меня не сложная проблема, но мои знания R довольно основны c, и поэтому я не могу найти ответ. У меня есть 4 переменные. Одним из них является группирующая переменная, которую я называю cluster. Остальные 3 (ID, IDman, IDwoman) являются удостоверениями личности. Примерно так:

cluster <- c("a", "a", "a", "b", "b", "b", "c", "c", "c")

ID <- c(1, 7, 18, 3, 3, 9, 25, 10, 19)

IDman <- c(1, 2, 3, 3, 3, 4, 10, 10, 6)

IDwoman <- c(5, 7, 9, 11, 12, 14, 19,19,5)

households <- data.frame(cluster, ID, IDman, IDwoman)

Фрейм данных (household) в основном показывает лиц (ID), которые находятся в домашнем хозяйстве (cluster). Иногда эти люди являются браком, и эта информация предоставляется определенной комбинацией IDman и IDwoman: это происходит, когда ID равно IDman и ID равно IDwoman в пределах одного кластера. Например, для первого кластера (cluster = a или первые 3 строки) существует брак. IDman = 1 и IDwoman = 7 - это брак, потому что они находятся в одном домохозяйстве (кластер = a) и потому что ID и IDman равны 1 в первом ряду, но также ID и IDwoman равны 7 во втором (все это происходит в пределах кластер а).

Итак, мне нужно найти количество уникальных комбинаций для каждой cluster ID-equals-IDman и ID-equals-IDwoman. Например, во втором cluster у нас его нет (так как нет IDwoman = 9), а во втором cluster у нас снова один, так как IDman = 10 и IDwoman = 19 появляются как в ID, так и в Повторение наблюдения IDman = 10 и IDwoman = 19 не учитывается. Результатом не должен быть набор данных, показывающий эти ссылки. Просто количество этих уникальных комбинаций на кластер.

Я не знаю, как это решить. Я пробовал вещи с помощью apply или sapply функций, но ни одна из них не работала.

Любая идея очень приветствуется.

Спасибо!

1 Ответ

1 голос
/ 22 февраля 2020

Рекомендуется присвоить столбец брак с ave (встроенное агрегирование по группам), где max используется для возврата любых TRUE значений.

households <- within(households, {    
    man <- ave(IDman %in% ID, cluster, FUN=max)
    woman <- ave(IDwoman %in% ID, cluster, FUN=max)
    marriage <- man == 1 & woman == 1

    rm(man, woman)    
})

households
#   cluster ID IDman IDwoman marriage
# 1       a  1     1       5     TRUE
# 2       a  7     2       7     TRUE
# 3       a 18     3       9     TRUE
# 4       b  3     3      11    FALSE
# 5       b  3     3      12    FALSE
# 6       b  9     4      14    FALSE
# 7       c 10    10      19     TRUE
# 8       c 19     6       5     TRUE
# 9       c 25    10      19     TRUE

А для уникальных комбинаций отфильтруйте фрейм данных соответственно по строкам и столбцам, затем выполните unique:

unique(households[households$marriage == TRUE,
                  c("cluster", "marriage")])

#   cluster marriage
# 1       a     TRUE
# 7       c     TRUE
...