使用基于ID变量的因子值填充缺失值

时间:2015-10-14 16:18:58

标签: r missing-data

我想根据<NA>变量为ID填充正确的因子值。

以下是变量:

ID <- c(1,1,1,2,2,2,3,3,3)
Gender_NA <- c("m",NA,"m",NA,"f",NA,"m","m",NA)
Gender  <- c("m","m","m","f","f","f","m","m","m")

以下是我的数据:

Data_have <- data.frame (ID,Gender_NA)

ID    Gender_NA
 1     m
 1    <NA>
 1     m
 2    <NA>
 2     f
 2    <NA>
 3     m
 3     m
 3    <NA>

以下是我想要的数据:

Data_whant <- data.frame (ID,Gender)

ID Gender
1    m
1    m
1    m
2    f
2    f
2    f
3    m
3    m
3    m

我试图在这个论坛上找到解决方案,但我无法让我工作。

非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

来自na.locf的{​​{1}}函数可用于将library(zoo)元素替换为相邻的非NA前一元素。使用NA,我们将'data.frame'转换为'data.table',按'ID'分组,我们用之前的非NA替换NA元素,如果第一个元素是NA,则不会要替换,我们可以使用带有选项data.table的第二个na.locf来替换剩余的NA和后续的非NA元素。

fromLast=TRUE

或者在按library(zoo) library(data.table) setDT(Data_have)[, Gender := na.locf(na.locf(Gender_NA, na.rm=FALSE),fromLast=TRUE), by = ID][, Gender_NA := NULL] Data_have # ID Gender #1: 1 m #2: 1 m #3: 1 m #4: 2 f #5: 2 f #6: 2 f #7: 3 m #8: 3 m #9: 3 m 进行分组时,我们可以使用ID省略所有NAs并选择第一个元素,如下所示:

na.omit()

或者使用与setDT(Data_have)[, Gender := na.omit(Gender_NA)[1L], by = ID][, Gender_NA := NULL] 相同的方法:

dplyr

答案 1 :(得分:1)

以下是我使用data.table

的方式
require(data.table) # v1.9.6+
dt = data.table(ID, Gender_NA)
# Gender_NA is of character type

以下是答案:

dt[is.na(Gender_NA), Gender_NA := na.omit(dt)[.SD, Gender_NA, mult="first", on="ID"]]