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

标签 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

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

非常感谢您的帮助。

最佳答案

na.locf来自 library(zoo) 的函数可用于替换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() 省略所有 NA并选择第一个元素,如下所示:

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

关于r - 使用基于 ID 变量的因子值填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33130589/

相关文章:

python - 如何在Keras R中提取VGG16的top-K层

R:使用 SMOTE 包 "invalid ' 标签时出现问题'"

css - 如何访问 shinyapps.io 上应用程序的 R+Shiny 代码?

scala - 将无效数据设置为 Spark DataFrames 中的缺失数据

r 用常量替换缺失值,列名遵循通用模式

r - train() 函数中的缺失值错误 树木的插入符号

r - 处理 R 中缺失/不完整的数据——是否有屏蔽但不删除 NA 的功能?

javascript - Rhandsontable 条件格式 - 如何根据特定属性值突出显示行?

r - 如何在R中使用索引函数创建多列?

r - R中缺失和审查数据的多重插补