R 用中值替换缺失值&;用最高频率替换丢失的字符

R 用中值替换缺失值&;用最高频率替换丢失的字符,r,R,我正在尝试编写一个函数,用数值的中值替换数据框中缺少的数值。同样,我需要用字符变量的最高频率值替换缺少的字符 它需要在不使用任何包的情况下完成 数据如下所示: ID GLUC TGL HDL LDL HRT MAMM SMOKE 1 A 88 NA 32 99 Y <NA> ever 2 B NA 150 60 NA <NA> no never 3 C 110 NA NA 120 N <NA> <NA

我正在尝试编写一个函数,用数值的中值替换数据框中缺少的数值。同样,我需要用字符变量的最高频率值替换缺少的字符

它需要在不使用任何包的情况下完成

数据如下所示:

 ID GLUC TGL HDL LDL  HRT MAMM SMOKE
1  A   88  NA  32  99    Y <NA>  ever
2  B   NA 150  60  NA <NA>   no never
3  C  110  NA  NA 120    N <NA>  <NA>
4  D   NA 200  65 165 <NA>  yes never
5  E   90 210  NA 150    Y <NA> never
6  F   88  NA  32 210 <NA>  yes  ever
ID GLUC-TGL-HDL-LDL-HRT-MAMM烟雾
1 A 88 NA 32 99 Y有史以来
2 B不适用150 60不适用从不适用
3C110Na120N
4 D NA 200 65 165是的从不
5 E 90 210 NA 150 Y从不
6 F 88 NA 32 210是的
编辑

这就是我到目前为止所拥有的,我不确定我是否已经接近了

impute<- function(dat, varlist) {
  if (is.numeric(varlist)) {
    res <- median(varlist, na.rm = TRUE)
  }
  else {
    res <- dat[which.max(varlist)]
  }
  na.index <- which(is.na(varlist))
  dat[na.index] <- res
  dat
}

impute您可以编写如下函数:

impute <- function(data, varlist) {
  data[varlist] <- lapply(data[varlist], function(x) {
    if(is.numeric(x)) x[is.na(x)] <- median(x, na.rm = TRUE)
    else x[is.na(x)] <- Mode(na.omit(x))
    return(x)
  })
  return(data[varlist])
}

impute(df, c('GLUC', 'HRT'))

#  GLUC HRT
#1   88   Y
#2   89   Y
#3  110   N
#4   89   Y
#5   90   Y
#6   88   Y

对不起,标签不正确。我只是对原始帖子进行了一次编辑,以提供我在解决这个问题上的拙劣尝试。我完全迷路了。我有两个方面的意见。首先,在没有现有所有数据插补包支持的情况下进行数据插补有点奇怪。听起来有点像教授教C++的时候…如果没有标准库的支持^^^^其次,如果我记得几年前的一次研讨会,用平均值或中位数输入数据可能会破坏数据中存在的相关性结构(因此可能你真的不想这么做,这取决于你的用例):)这几乎是可行的。然而,当我输入impute(dat=patient,varlist=“HRT”)时,我需要的输出只是HRT的信息。现在,它可以用于HRT,但输出还包括所有其他变量(不进行插补)。可能只是返回数据[varlist]?请参阅更新的答案@fiverings84。非常感谢!我特别着迷于模式部分是如何使用的。喜欢学习新事物。
Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}