在面板数据集中对 R 中的分组值进行均质化
Homogenize grouped values in R in panel dataset
我有一个家庭面板调查数据集。它有两项调查:一项针对个人,一项针对家庭。每个家庭中的一个人回答两个问题,而家庭中的所有其他人只回答个人调查。市政所在地只在入户人。数据集是一个面板,因此对于不同的研究波次,每个观察值都有多次。所以基本上我有这样的东西:
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,每个人在 5 中都有 B 和 C。我不能手动这样做,因为数据集有大约 130k 个观察值。
我尝试了多种方法来分组数据和改变新变量,但我无法得到我想要的。
感谢您的帮助!
由于每个家庭只有一个值,您可以这样做:
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])
df <- df %>% mutate(municipality=case_when(idhousehold %in% c(1,2,4)~ "A",idhousehold %in% c(3,6) ~ "B",idhousehold %in% 5 ~"C"))
使用 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
由 reprex package (v0.3.0)
于 2020-04-14 创建
我有一个家庭面板调查数据集。它有两项调查:一项针对个人,一项针对家庭。每个家庭中的一个人回答两个问题,而家庭中的所有其他人只回答个人调查。市政所在地只在入户人。数据集是一个面板,因此对于不同的研究波次,每个观察值都有多次。所以基本上我有这样的东西:
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,每个人在 5 中都有 B 和 C。我不能手动这样做,因为数据集有大约 130k 个观察值。
我尝试了多种方法来分组数据和改变新变量,但我无法得到我想要的。
感谢您的帮助!
由于每个家庭只有一个值,您可以这样做:
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])
df <- df %>% mutate(municipality=case_when(idhousehold %in% c(1,2,4)~ "A",idhousehold %in% c(3,6) ~ "B",idhousehold %in% 5 ~"C"))
使用 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
由 reprex package (v0.3.0)
于 2020-04-14 创建