将 NA 替换为基于 ID 属性的模式

标签 r dataset mode

我有一个数据集 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/

相关文章:

c# - 是否可以在 finally block 中处理数据集然后返回数据集?

python - 如何在 python 中将一个 netcdf 文件中的变量添加到另一个 netcdf 文件中?

sql - SELECT 模式/模态值 SQL

r - 用于运行统计分析的数据集

gwt - 停止在开发模式下运行 GWT 应用程序(在 eclipse 中)

python - 如何从 pandas 的每一列中获取 n 个最多的列值

python - R 中的 lm 与 Python 中的 statsmodel OLS 的不同结果

r - 短文本列表,要选择至少有 2 个字母不同的行

mysql - RMySQL 返回 utf8 文本的乱码

r - 每隔一列拆分一个数据框以创建两个单独的文件