使用基于ID属性的模式替换NA

时间:2016-02-10 10:18:09

标签: r dataset mode

我有一个数据集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循环中返回模式吗?

谢谢

1 个答案:

答案 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类。