用组值替换NA值

use*_*642 6 r na

我有一个如下的df,它有5个家庭的20个人.家庭中的一些人缺少他们是否有医疗卡的数据.我想给这些人提供与其家庭中其他人相同的价值(不是NA值,实际二进制值是0或1).

我尝试了以下代码,这是我认为正确方向的一步 - 但不是100%正确,因为a)如果每个家庭的med_card的第一个值是NA而b)它没有,它就不起作用为所有家庭成员取代NA 1.

DF<- ddply(df, .(hhold_no), function(df) {df$med_card[is.na(df$med_card)] <- head(df$med_card, na.rm=TRUE); return(df)})
Run Code Online (Sandbox Code Playgroud)

任何指针都将非常感谢,谢谢

样本df

df
   person_id hhold_no med_card
1          1        1        1
2          2        1        1
3          3        1       NA
4          4        1       NA
5          5        1       NA
6          6        2        0
7          7        2        0
8          8        2        0
9          9        2        0
10        10        3       NA
11        11        3       NA
12        12        3       NA
13        13        3        1
14        14        3        1
15        15        4        1
16        16        4        1
17        17        5        1
18        18        5        1
19        19        5       NA
20        20        5       NA
Run Code Online (Sandbox Code Playgroud)

和代码

person_id<-as.numeric(c(1:20))
hhold_no<-as.numeric(c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,4,4,5,5,5,5))
med_card<-as.numeric(c(1,1,NA,NA,NA,0,0,0,0,NA,NA,NA,1,1,1,1,1,1,NA,NA))
df<-data.frame(person_id,hhold_no, med_card)
Run Code Online (Sandbox Code Playgroud)

期望的输出

df
   person_id hhold_no med_card med_card_new
1          1        1        1            1
2          2        1        1            1
3          3        1       NA            1
4          4        1       NA            1
5          5        1       NA            1
6          6        2        0            0
7          7        2        0            0
8          8        2        0            0
9          9        2        0            0
10        10        3       NA            1
11        11        3       NA            1
12        12        3       NA            1
13        13        3        1            1
14        14        3        1            1
15        15        4        1            1
16        16        4        1            1
17        17        5        1            1
18        18        5        1            1
19        19        5       NA            1
20        20        5       NA            1
Run Code Online (Sandbox Code Playgroud)

sgi*_*ibb 7

试试ave.它将功能应用于组.?ave详细了解一下,例如:

df$med_card_new <- ave(df$med_card, df$hhold_no, FUN=function(x)unique(x[!is.na(x)]))

#   person_id hhold_no med_card med_card_new
#1          1        1        1            1
#2          2        1        1            1
#3          3        1       NA            1
#4          4        1       NA            1
#5          5        1       NA            1
#6          6        2        0            0
#7          7        2        0            0
#8          8        2        0            0
#9          9        2        0            0
Run Code Online (Sandbox Code Playgroud)

请注意,这只有在家庭中的所有值NA都不存在且不应该不同时才会起作用(例如,人1 == 1,人2 == 0).


G. *_*eck 6

这正是动物园包中的na.aggregate(链接):

library(zoo)

transform(df, med_card_new = na.aggregate(med_card, by = hhold_no))
Run Code Online (Sandbox Code Playgroud)

这用mean; 但是,您可以指定您喜欢的任何功能.例如,如果您希望返回一个NA,如果一个组中的所有项都是NA(而不是NaN,mean如果给定一个零长度向量,则返回NaN )然后

meanNA <- function(x, ...) if (all(is.na(x))) NA else mean(x, ...)
transform(df, med_card_new = na.aggregate(med_card, by = hhold_no, FUN = meanNA))
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 5

data.table

library(data.table)
setDT(df)[, med_card2 := unique(med_card[!is.na(med_card)]), by = hhold_no]

#     person_id hhold_no med_card med_card2
#  1:         1        1        1         1
#  2:         2        1        1         1
#  3:         3        1       NA         1
#  4:         4        1       NA         1
#  5:         5        1       NA         1
#  6:         6        2        0         0
#  7:         7        2        0         0
#  8:         8        2        0         0
#  9:         9        2        0         0
# 10:        10        3       NA         1
# 11:        11        3       NA         1
# 12:        12        3       NA         1
# 13:        13        3        1         1
# 14:        14        3        1         1
# 15:        15        4        1         1
# 16:        16        4        1         1
# 17:        17        5        1         1
# 18:        18        5        1         1
# 19:        19        5       NA         1
# 20:        20        5       NA         1
Run Code Online (Sandbox Code Playgroud)