R - 根据配对数据填充缺失的信息

时间:2016-02-26 20:50:17

标签: r fill missing-data

我正在尝试使用基于相关个人(情侣)的信息填充缺失案例。

我的数据看起来像这样

   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))

1 个答案:

答案 0 :(得分:3)

这是一种方法,假设任何一对(由两个hserial s组成)应始终在children中具有相同的是/否条目,除非两个人都有Not eligible个条目。因此,它会为每对夫妇计算setdiff个可用children信息和Not eligible。如果所有(两个)条目都是“不符合条件”,则返回NA,因为我认为这是处理缺失值的更好方法(因为您知道有许多专门的函数可以用于{{1}你不能以同样的方式使用NA条目。

Not eligible