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

2023-12-10

我有一个数据集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(使用前将#替换为@)

将 NA 替换为基于 ID 属性的模式 的相关文章

随机推荐