Сравните две группы, чтобы увидеть, есть ли у них одни и те же люди, и назначьте ID для похожих групп. - PullRequest
0 голосов
/ 24 октября 2018

Я хотел бы создать основной «Идентификатор домохозяйства» для групп, в которых в каждом домохозяйстве одни и те же люди.Например, скажем, у меня есть набор данных с 4 людьми, которые находятся в семи разных домохозяйствах.

dt <- read.table(header=T, text='
        p_id    hh_id
        1   100
        2   100
        3   100

        1   200
        2   200
        3   200

        1   300
        2   300
        3   300
        4   300

        2   400
        3   400

        2   500
        3   500
        4   500

        2   600
        3   600

        2   700
        3   700
        4   700
             ')

Я хотел бы создать основной идентификатор домохозяйства, в котором бы идентифицировались домохозяйства с одинаковым идентификатором, исходя из того, кто именно был в домохозяйстве.

        p_id    hh_id   master_id
        1       100     1       
        2       100     1
        3       100     1
        1       200     1
        2       200     1
        3       200     1
        1       300     2
        2       300     2
        3       300     2
        4       300     2
        2       400     3
        3       400     3
        2       500     4
        3       500     4
        4       500     4
        2       600     3
        3       600     3
        2       700     4
        3       700     4
        4       700     4

БОНУС: Какой наилучший способ добавить вес в этот расчет идентификатора на основе некоторых критериев, например, было ли большинство «первичных» людей в других домохозяйствах?Например, если человек 1 и 2 - взрослые, а 3 и 4 - дети, как мы можем удержать мастера master_id, когда 1 и 2 вместе, но отличаются, когда один из них отсутствует?

        p_id    hh_id   master_id   wt_m_id
        1       100     1           1       
        2       100     1           1
        3       100     1           1
        1       200     1           1
        2       200     1           1
        3       200     1           1
        1       300     2           1
        2       300     2           1
        3       300     2           1
        4       300     2           1
        2       400     3           2
        3       400     3           2
        2       500     4           2
        3       500     4           2
        4       500     4           2
        2       600     3           2
        3       600     3           2
        2       700     4           2
        3       700     4           2
        4       700     4           2    

Я попробовал следующий код, но он только создавал последовательные числа или пытался получить что-то совершенно другое.

dt %>% mutate(new_id = interaction(p_id, hh_id)) 

и

dt %>% mutate(ID = group_indices_(dt, .dots=c("p_id", "hh_id")))

1 Ответ

0 голосов
/ 24 октября 2018

Таким образом, идея заключается в том, что мы можем создать уникальный идентификатор домохозяйства, создав столбец идентификаторов на основе комбинации людей

Во-первых, нам нужно сгруппировать по hh_id, потому что это определяет, какие люди разделяютдомашнее хозяйство.Затем мы сортируем по p_id, поскольку предположительно наличие 1, 2, 3 в домашнем хозяйстве эквивалентно наличию 2, 1, 3 в домашнем хозяйстве.Затем мы объединяем p_id в каждой группе, используя stringr::str_c, с collapse = "".

library(tidyverse)
library(stringr)

dt %>% group_by(hh_id) %>% 
  arrange(hh_id, p_id) %>% 
  mutate(HH_Group = str_c(p_id, collapse = ""))

# A tibble: 20 x 3
# Groups:   hh_id [7]
    p_id hh_id HH_Group
   <int> <int> <chr>   
 1     1   100 123     
 2     2   100 123     
 3     3   100 123     
 4     1   200 123     
 5     2   200 123     
 6     3   200 123     
 7     1   300 1234    
 8     2   300 1234 

HH_Group теперь представляет каждую группу людей в домашнем хозяйстве.Если вы хотите нормализовать HH_Group в последовательное целое число, вы можете сделать:

dt$HH_Group <- as.numeric(as.factor(dt$HH_Group))

# A tibble: 20 x 3
# Groups:   hh_id [7]
    p_id hh_id HH_Group
   <int> <int>    <dbl>
 1     1   100        1
 2     2   100        1
 3     3   100        1
 4     1   200        1
 5     2   200        1
 6     3   200        1
 7     1   300        2
 8     2   300        2
...