使用基于 ID 变量的因子值填充缺失值
Fill up missing values with a factor value based on an ID variable
我想根据 ID
变量用正确的因子值填充 <NA>
。
变量如下:
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
我已尝试在此论坛上找到解决方案,但无法正常工作。
将不胜感激。
library(zoo)
中的 na.locf
函数可用于将 NA
元素替换为相邻的非 NA 前一个元素。使用data.table
,我们将'data.frame'转换为'data.table',按'ID'分组,我们用前面的非NA替换NA元素,如果第一个元素是NA,它不会被替换,我们可以使用带有选项 fromLast=TRUE
的第二个 na.locf
将剩余的 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
下面是我使用 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"]]
我想根据 ID
变量用正确的因子值填充 <NA>
。
变量如下:
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
我已尝试在此论坛上找到解决方案,但无法正常工作。
将不胜感激。
library(zoo)
中的 na.locf
函数可用于将 NA
元素替换为相邻的非 NA 前一个元素。使用data.table
,我们将'data.frame'转换为'data.table',按'ID'分组,我们用前面的非NA替换NA元素,如果第一个元素是NA,它不会被替换,我们可以使用带有选项 fromLast=TRUE
的第二个 na.locf
将剩余的 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
下面是我使用 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"]]