根据 ID 属性将 NA 替换为模式
Replace NA with mode based on ID attribute
我有一个数据集 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)))]
}
来自以下link:Is there a built-in function for finding the mode?
但我不知道如何在 for 循环中应用它,我尝试了 apply、ave 函数,但由于维度不同,它们似乎不是正确的选择。
任何人都可以帮助 return 我的 for 循环中的模式吗?
谢谢
我们可以使用 library(zoo)
中的 na.aggrgate
,将 FUN
指定为 Mode
。如果这是一个 group by 操作,我们可以使用 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))
注意:Mode
来自 OP 的 post。另外,假设 'att' 是 character
class.
我有一个数据集 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)))]
}
来自以下link:Is there a built-in function for finding the mode?
但我不知道如何在 for 循环中应用它,我尝试了 apply、ave 函数,但由于维度不同,它们似乎不是正确的选择。
任何人都可以帮助 return 我的 for 循环中的模式吗?
谢谢
我们可以使用 library(zoo)
中的 na.aggrgate
,将 FUN
指定为 Mode
。如果这是一个 group by 操作,我们可以使用 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))
注意:Mode
来自 OP 的 post。另外,假设 'att' 是 character
class.