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)))]
}