Гомогенизировать сгруппированные значения в R в наборе данных панели - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть набор данных опроса домохозяйств. В нем два опроса: один для физических лиц и один для домашних хозяйств. Один человек в каждом домохозяйстве отвечает на оба вопроса, тогда как все остальные члены домохозяйства отвечают только на индивидуальный опрос. Муниципальное местоположение находится только в человеке, который заполнил houehold. Набор данных представляет собой панель, поэтому каждое наблюдение проводится несколько раз для разных волн исследования. В общем, у меня есть что-то вроде этого:

  df <- data.frame(id = c (11,11, 12,12,13, 13,14, 14,21, 21,22, 22,31, 31,32, 32,33, 33,34, 34,41, 41,42, 42,43, 43,44, 44,51, 51,61, 61,62, 62))
df$idhousehold <- c(1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 5,5, 6, 6, 6,6)
df$municipality <- c(NA, NA, NA,NA, NA, NA,"A","A",NA, NA, "A", "A",NA, NA,NA, NA, "B", "B", NA,NA, "A", "A",NA,NA,NA,NA,NA,NA, "C", "C","B","B",NA, NA)
df$year <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)
df

Что я в основном хочу сделать, так это назначить одинаковое муниципальное значение для каждого члена одной семьи. В приведенном выше примере это означает, что у каждого в домохозяйствах 1, 2 и 4 есть значение «A» для муниципалитета, для домохозяйств 3 и 6 у каждого есть B и C в 5. Я не могу сделать это вручную, потому что набор данных имеет около 130 тыс. Наблюдений.

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

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Поскольку для каждого домохозяйства существует только одно значение, вы можете сделать:

df$municipality <- ave(df$municipality, df$idhousehold, FUN = na.omit)

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

df$municipality <- ave(df$municipality, df$idhousehold, FUN = function(x) unique(na.omit(x))[1])

df
   id idhousehold municipality
1  11           1            A
2  12           1            A
3  13           1            A
4  14           1            A
5  21           2            A
6  22           2            A
7  31           3            B
8  32           3            B
9  33           3            B
10 34           3            B
11 41           4            A
12 42           4            A
13 43           4            A
14 44           4            A
15 51           5            C
16 61           6            B
17 62           6            B

Эквивалентно dplyr:

df %>%
  group_by(idhousehold) %>%
  mutate(municipality = unique(na.omit(municipality))[1])
0 голосов
/ 14 апреля 2020

Подход, использующий функцию fill() из tidyr:

library(tidyverse)

df <- data.frame(id = c (11,11, 12,12,13, 13,14, 14,21, 21,22, 22,31, 31,32, 32,33, 33,34, 34,41, 41,42, 42,43, 43,44, 44,51, 51,61, 61,62, 62))
df$idhousehold <- c(1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 5,5, 6, 6, 6,6)
df$municipality <- c(NA, NA, NA,NA, NA, NA,"A","A",NA, NA, "A", "A",NA, NA,NA, NA, "B", "B", NA,NA, "A", "A",NA,NA,NA,NA,NA,NA, "C", "C","B","B",NA, NA)
df$year <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)

df <- df %>% 
  group_by(idhousehold) %>% 
  fill(municipality, .direction = "updown") %>% 
  ungroup()

df
#> # A tibble: 34 x 4
#>       id idhousehold municipality  year
#>    <dbl>       <dbl> <chr>        <dbl>
#>  1    11           1 A                1
#>  2    11           1 A                2
#>  3    12           1 A                1
#>  4    12           1 A                2
#>  5    13           1 A                1
#>  6    13           1 A                2
#>  7    14           1 A                1
#>  8    14           1 A                2
#>  9    21           2 A                1
#> 10    21           2 A                2
#> # … with 24 more rows

Создан в 2020-04-14 пакетом Представить (v0.3.0)

0 голосов
/ 14 апреля 2020
df <- df %>% mutate(municipality=case_when(idhousehold %in% c(1,2,4)~ "A",idhousehold %in% c(3,6) ~ "B",idhousehold %in% 5 ~"C"))
...