我是R的新手,正在研究我的第一个数据集,因此也是这些问题。如果它非常基本,我道歉。
我有一个包含少量列的数据框(Df
)(一些内插,一些因素和少量文本)。
因子变量(例如:f1)都具有True / False / NA值。我试图用最常见的值替换缺失值。
我知道每个因子变量的最常见值。我发现它们使用summary(Df)
。但是,不想硬代码或使用太多代码行。我来自数据库背景,我将数据框可视化为一个表,并将此因子变量视为一列。也许这就是我的问题!
以下是我尝试的选项及其无效的原因:
Df$f1[is.na(Df$D1)] <- median(as.numeric(levels(Df$f1)),na.rm=TRUE)
自投掷warning : NAs introduced by coercion
以来,这无效。
as.numeric
将因子转换为数字,然后找到中位数和重新编码。但它将大部分内容转换为NA
s。请帮忙!
答案 0 :(得分:0)
如果colnums
是要更改NA
值的因子变量列数的向量,则可以使用以下内容。如果您想更改所有因素,请使用
colnums <- which(sapply(df,is.factor))
NA2mf <- function(col.num, df){
col <- df[,col.num]
tab <- table(col)
max <- which.max(tab)
if(sum(tab == tab[max]) > 1) {
warning(paste('no unique most frequent factor in var', as.character(names(df)[col.num])))
}
col[is.na(col)] <- names(max)
col
}
df[,colnums] <- sapply(colnums, NA2mf, df = Df)
答案 1 :(得分:0)
代码少一点的另一种选择:
0.14.3
对于以后的R&C,使用令人敬畏的dt = data.frame(x = sample(c(letters[1:5],NA),50,replace=TRUE))
for(field in names(dt)){
dt[is.na(dt[,field]),field] <- names(sort(table(dt$x),TRUE)[1])
}
软件包,有更优雅的方法来实现这一目标。