2015-10-14 91 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"]]