我有一个数据集dt
,我希望根据ID将每个属性的模式替换为NA
值,如下所示:
在:
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,因此我尝试调整代码如下: / p>
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循环中应用它,我尝试应用,ave函数,但由于尺寸不同,它们似乎不是正确的选择。
有人可以帮我解决如何在for循环中返回模式吗?
谢谢
答案 0 :(得分:2)
我们可以使用na.aggrgate
中的library(zoo)
,将FUN
指定为Mode
。如果这是按操作分组,我们可以使用data.table
执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)
),按&#39; id&#39;分组,我们应用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的帖子Mode
。另外,假设&#39; att&#39;是character
类。