我有一个数据集 dt
,我想根据 id 将 NA
值替换为每个属性的 mode,如下所示:
之前:
id att
1 v
1 v
1 NA
1 c
2 c
2 v
2 NA
2 c
我正在寻找的结果是:
id att
1 v
1 v
1 v
1 c
2 c
2 v
2 c
2 c
我做了一些尝试,例如我发现另一个类似的问题想要用 mean 替换 NA (它有一个内置函数),因此我尝试调整代码如下:
for (i in 1:dim(dt)[1]) {
if (is.na(dt$att[i])) {
att_mode <- # I am stuck here to return the mode of an attribute based on ID
dt$att[i] <- att_mode
}
}
我找到了以下函数来计算众数
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
来自以下链接:Is there a built-in function for finding the mode?
但我不知道如何在 for 循环中应用它,我尝试了 apply、ave 函数,但由于维度不同,它们似乎不是正确的选择。
有人可以帮助我了解如何返回 for 循环中的模式吗?
谢谢
最佳答案
我们可以使用library(zoo)
中的na.aggrgate
,将FUN
指定为Mode
。如果这是一个分组操作,我们可以使用data.table
来完成。将“data.frame”转换为“data.table”(setDT(df1)
),按“id”分组,我们应用na.aggregate
library(data.table)
library(zoo)
setDT(df1)[, att:= na.aggregate(att, FUN=Mode), by = id]
df1
# id att
#1: 1 v
#2: 1 v
#3: 1 v
#4: 1 c
#5: 2 c
#6: 2 v
#7: 2 c
#8: 2 c
<小时/>
与dplyr
类似的选项
library(dplyr)
df1 %>%
group_by(id) %>%
mutate(att = na.aggregate(att, FUN=Mode))
注意:模式
来自OP的帖子。另外,假设“att”是character
类。
关于将 NA 替换为基于 ID 属性的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35312390/