【发布时间】:2022-01-04 03:00:04
【问题描述】:
我对缺失值的数据集进行了 5 次插补。出于我的目的,我想用 5 个插补中的模式替换缺失值。假设我有以下数据集,其中 df 是我的原始数据,ID 是用于识别每个案例的分组变量,imp 是我的估算数据:
df <- data.frame(ID = c(1,2,3,4,5),
var1 = c(1,NA,3,6,NA),
var2 = c(NA,1,2,6,6),
var3 = c(NA,2,NA,4,3))
imp <- data.frame(ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5),
var1 = c(1,2,3,3,2,5,4,5,6,6,7,2,3,2,5,6,5,6,6,6,3,1,2,3,2),
var2 = c(4,3,2,3,2,4,6,5,4,4,7,2,4,2,3,6,5,6,4,5,3,3,4,3,2),
var3 = c(7,6,5,6,6,2,3,2,4,2,5,4,5,3,5,1,2,1,3,2,1,2,1,1,1))
我有一个可行的方法,但它涉及大量手动编码,因为我总共有大约 200 个变量(我在 3 个具有不同变量的不同数据集上执行此操作)。对于一个变量,我的代码如下所示:
library(dplyr)
mode <- function(codes){
which.max(tabulate(codes))
}
var1 <- imp %>% group_by(ID) %>% summarise(var1 = mode(var1))
df3 <- df %>%
left_join(var1, by = "ID") %>%
mutate(var1 = coalesce(var1.x, var1.y)) %>%
select(-var1.x, -var1.y)
因此,只有当值为 NA 时,df 中的原始值才会被模式替换。
为每个变量手动编码需要很长时间。我希望有一种更简单的方法可以通过 ID 从每个变量的估算数据集中计算模式,然后在原始数据中用该模式替换 NA。我想也许我可以把变量名放在一个向量中,并以某种方式用一个代码迭代它们,在其中我更改每个变量名,但我不知道该去哪里。
x <- colnames(df)
# Attempting to iterate through variables names using i
i = as.factor(x[[2]])
这就是我卡住的地方。非常感谢任何帮助!
【问题讨论】:
-
df %>% left_join(var1, by = "ID") %>% mutate(var1 = coalesce(var1.x, var1.y))返回错误Error: Problem withmutate()` 列var1。 ℹvar1 = coalesce(var1.x, var1.y).x 不能组合..1和 ..2。`你能解决它吗? -
我已经多次运行此代码并检查我没有加载其他可能会干扰的包,并且我没有收到任何错误。我想知道其他人是否对此代码有疑问?
-
那是因为你确实有一个名为
mode的函数,它返回一个数值,但这个函数没有定义。您还需要发布该功能。此外,您宁愿称它为Mode而不是mode,因为mode指的是数据类型存储。例如检查?base::mode。 -
@PeaceWang 您正在从基础 R 调用
mode函数,但 OP 正在调用用户定义的函数。 -
@Onyambu 清除。谢谢。
标签: r replace mode imputation