2015-10-14 90 views
1

我想根据ID变量填充<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> 

这里是我whant的数据有:

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

来自library(zoo)na.locf函数可用于用相邻的非NA之前的元素替代NA元素。使用data.table,我们将'data.frame'转换为'data.table',按'ID'分组,我们用前面的非NA代替NA元素,如果第一个元素是NA,它不会被替换,我们可以使用第二个na.locf和选项fromLast=TRUE来将剩余的NA替换为后续的非NA元素。

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分组,我们可以省略使用na.omit()所有NAS,并挑选第一元件如下:

setDT(Data_have)[, Gender := na.omit(Gender_NA)[1L], by = ID][, Gender_NA := NULL] 

或使用带有dplyr同样的方法:

library(dplyr) 
Data_have %>% 
    group_by(ID) %>% 
    transmute(Gender= first(na.omit(Gender_NA))) 
# ID Gender 
# (dbl) (fctr) 
#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 
+0

@Carl请检查更新 – akrun

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"]]