Гомогенизация сгруппированных значений в R в наборе данных панели

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

  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 000 наблюдений.

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

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


person AntVal    schedule 14.04.2020    source источник


Ответы (3)


Подход с использованием функции 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

Создано 14 апреля 2020 г. пакетом REPEX (v0.3.0)

person paqmo    schedule 14.04.2020

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

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

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

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])
person 27 ϕ 9    schedule 14.04.2020
comment
Спасибо! Но этого не произойдет: первое решение дает ошибку: столбец municipality должен иметь длину 5 (размер группы) или один, а не 2, а второй: ошибка в x [i] ‹- значении [[j]]: замена имеет нулевую длину - person AntVal; 14.04.2020
comment
У вас есть как случаи, когда существует более одного значения муниципалитета по идентификатору, так и случаи, когда их нет. - person 27 ϕ 9; 14.04.2020
comment
Отредактировали мой ответ, но было бы лучше увидеть образец ваших реальных данных. Поскольку у вас есть несколько значений муниципалитета на одно домашнее хозяйство, вы должны убедиться, что они не являются несколькими отдельными значениями. Также убедитесь, что значения NA на самом деле являются NA, а не значением символа или фактора, маскирующимся под NA. - person 27 ϕ 9; 14.04.2020
comment
Извините, это панельный набор данных, поэтому каждое наблюдение существует для нескольких волн / лет. Я обновил вопрос сейчас - person AntVal; 14.04.2020

person    schedule
comment
Спасибо! Да, это сработает, но у меня более 130 тысяч наблюдений и сотни значений для домашнего хозяйства, так что на это у меня уйдет целая вечность, и я, вероятно, допущу в этом несколько ошибок. - person AntVal; 14.04.2020