我正在处理一个标记为“?”的缺失值很少的数据集,我必须用该列的最常见值(模式)替换它们。但是,我想编写一个代码,立即为整个数据集运行它。
我到目前为止 -
df <- read.csv("mushroom.txt", na.strings = "?",header=FALSE)
现在,尝试使用该列的模式替换文件中的所有NA值。请帮忙。
答案 0 :(得分:1)
replaceQuestions <- function(vector) {
mostCommon <- names(sort(table(vector), decreasing = TRUE))[1]
vector[vector == '?'] <- mostCommon
vector
}
df <- apply(df, 2, replaceQuestions)
不可重复,所以我不确定这是否是您所寻找的,但这解决了我所解释的问题。
答案 1 :(得分:1)
由于您希望通过应用并使用is.na
标识要替换的列来替换您希望以列方式操作的列的模式。
apply(df, 2, function(x){
x[is.na(x)] <- names(which.max(table(x)))
return(x) })
请注意,apply
会返回matrix
,因此如果您需要data.frame
,则需要使用as.data.frame
进行转换
答案 2 :(得分:1)
正如你在问题中所说的那样,你在csv阅读期间用"?"
替换了NA,所以我认为这可能有所帮助:
apply(df,2,function(x) gsub("\\?",names(sort(-table(x,exclude="?")))[1],x))
exclude
部分是为了避免选择"?"
,它是否是最常见的值。 \\
是逃避特殊角色?到gsub。
====== 编辑添加 ======
gsub
会将所有内容转换为文字,您需要再次将其恢复为数字:
a<-apply(df,2,function(x) gsub("\\?",names(sort(-table(x,exclude="?")))[1],x))
new_df<-as.data.frame(apply(a,2,as.numeric))
最后一行将产生一个新的数据框
答案 3 :(得分:0)
或者:
apply(df, 2, function(x) {
x[is.na(x)] <- Mode(x[complete.cases(x)])
x})
这使用SO上众所周知的Mode功能。链接到函数Is there a built-in function for finding the mode?
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
答案 4 :(得分:0)
使用
for (i in ncol(dataframename){
dataframename[i]=
ifelse(is.na(dataframename[i]),mode(dataframename[i]),dataframename[i])
}