【问题标题】:Function to replace missing with median for whole dataframe用整个数据帧的中值替换缺失的函数
【发布时间】:2019-06-19 07:22:48
【问题描述】:

我正在尝试编写一个函数来用中位数替换列中的缺失值,这适用于因子/字符和数值。

library(dplyr)
test = data.frame(a=1:6,b=c("a","b",NA,NA,NA,"c"),c=c(1,1,1,1,2,NA),d=c("a","a","c",NA,NA,"b"))

fun_rep_na = function(df){
  for(i in colnames(df)){
    j<-sym(i)
    df = df %>% mutate(!!j=if_else(is.na(!!j),median(!!j, na.rm=TRUE),!!j))
  }
}

我看到 tidyr 有一个名为 replace_na 的函数,但我也不知道如何使用它。无论如何,我想要一个自定义函数。

上面的代码给了我一个错误。

【问题讨论】:

  • 您不需要 for 循环使用 mutate_all。顺便说一句,median 需要一个数字列
  • @akrun:啊,太好了,谢谢,我不知道
  • @Helen 阅读例如Allison, Paul D. 2002。缺失数据。 SAGE Publications, Inc.
  • 我现在没时间买书:/
  • @jay.sf:我是一名统计学家。

标签: r replace missing-data median


【解决方案1】:

我们可以将mutate_ifmedian 一起使用,因为median 仅适用于numeric

test %>% 
   mutate_if(is.numeric, list(~ replace(., is.na(.), median(., na.rm = TRUE))))

如果我们想要重复次数最多的值,那么我们可能需要Mode

Mode <- function(x) {
  x <- x[!is.na(x)]
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

Mode 函数首先在这里更新

test %>% 
  mutate_all(list(~ replace(., is.na(.), Mode(.))))
#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b

【讨论】:

  • 啊,看起来很漂亮。你能解释一下 ~ 的作用和所有的点吗?
  • @Helen 是一个 tilda 运算符,用来使 tidyverse 中的匿名函数调用简洁,否则可能需要function(x) replace(x, is.na(x),
  • 什么是匿名函数,什么是简洁?你能指出我在哪里阅读这方面的正确方向吗?
  • @Helen 匿名函数是一种用于多种语言的函数(有时称为lambda 函数)。例如用python会是lambda x: x * 5或者用R,lapply(1:5, function(x) x: (x + 5))如果你检查了map和其他功能,简洁是map(1:5, ~ .x:(.x + 5))
【解决方案2】:

我认为您正在寻找 Mode 而不是中位数

here获取Mode函数

Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}

library(dplyr)

test %>%  mutate_all(~replace(., is.na(.), Mode(na.omit(.))))

#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2018-02-17
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多