我正在尝试使用基于相关个人(情侣)的信息填充缺失案例。
我的数据看起来像这样
hserial sex age children
1 1001041 Male 30 Yes
2 1001041 Female 32 Yes
3 1001061 Male 22 No
4 1001061 Female 21 No
5 1001091 Male 38 Yes
6 1001091 Female 37 Yes
7 1001151 Male 31 No
8 1001151 Female 27 Not eligible
9 1001161 Male 33 Yes
10 1001161 Female 35 Yes
因此hserial
是 couple 标识符。第8行有一个缺失的案例Not eligible
,但该信息可从合作伙伴处获得(第7行)。
我正在努力寻找一种巧妙的方法来填补合作伙伴的信息。
我在想做像
这样的事情library(dplyr)
childsum = dta %>% group_by(hserial, sex, children) %>%
summarise(n = n()) %>% spread(sex, children)
我会得到
hserial n Male Female
1 1001041 1 Yes Yes
2 1001061 1 No No
3 1001091 1 Yes Yes
4 1001151 1 No Not eligible
5 1001161 1 Yes Yes
然后我可以做类似
的事情childsum$Male = ifelse(childsum$Male == 'Not eligible', childsum$Female, childsum$Male)
childsum$Female = ifelse(childsum$Female == 'Not eligible', childsum$Male, childsum$Female)
因此,对于Male
的每个缺失填充Female
信息,反之亦然。
然后合并返回结果以获取
hserial sex age children
1 1001041 Male 30 Yes
2 1001041 Female 32 Yes
3 1001061 Male 22 No
4 1001061 Female 21 No
5 1001091 Male 38 Yes
6 1001091 Female 37 Yes
7 1001151 Male 31 No
8 1001151 Female 27 No
9 1001161 Male 33 Yes
10 1001161 Female 35 Yes
任何想法如何做到这一点都很简洁?
dta = structure(list(hserial = c(1001041, 1001041, 1001061, 1001061,
1001091, 1001091, 1001151, 1001151, 1001161, 1001161), sex = structure(c(1L,
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("Male", "Female"
), class = "factor"), age = c(30, 32, 22, 21, 38, 37, 31, 27,
33, 35), children = structure(c(5L, 5L, 6L, 6L, 5L, 5L, 6L, 4L,
5L, 5L), .Label = c("DNA Does not apply", "NA No answer", "NA No answer",
"Not eligible", "Yes", "No"), class = "factor")), class = "data.frame", .Names = c("hserial",
"sex", "age", "children"), row.names = c(NA, -10L))
答案 0 :(得分:3)
这是一种方法,假设任何一对(由两个hserial
s组成)应始终在children
中具有相同的是/否条目,除非两个人都有Not eligible
个条目。因此,它会为每对夫妇计算setdiff
个可用children
信息和Not eligible
。如果所有(两个)条目都是“不符合条件”,则返回NA
,因为我认为这是处理缺失值的更好方法(因为您知道有许多专门的函数可以用于{{1}你不能以同样的方式使用NA
条目。
Not eligible