我有一个数据集dt
我想更换NA
值与mode基于 id 的每个属性如下:
Before:
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
我做了一些尝试,例如我发现了另一个类似的问题,想要用 NA 替换mean(它有一个内置函数),因此我尝试调整代码如下:
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)))]
}
来自以下链接:是否有用于查找模式的内置函数?
但我不知道如何在 for 循环中应用它,我尝试了 apply、ave 函数,但由于尺寸不同,它们似乎不是正确的选择。
有人可以帮助我如何返回 for 循环中的模式吗?
谢谢
我们可以用na.aggrgate
from library(zoo)
,指定FUN
as 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))
NOTE: Mode
来自OP的帖子。另外,假设“att”是character
class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)