我不是一个经验丰富的编码人员,过去几周刚开始学习R,可以帮助完成与我的博士学位相关的一些工作。这是问题:
[许多小时以来,我一直没有成功尝试,使用R中的missForest包将缺失的值插入数据集。以下是我在使用伪造数据集时遇到的代表性示例。
数据集包含分类数值。导入时,我使用以下代码将类设置为“ factor”
data <- read.csv("~Data.csv", colClasses = c(rep('factor',3)))
>data
a b c
1 2 3
4 5
7 8 9
要验证类是否设置正确,我运行:
missForest::varClass(data)
返回:
[1] "factor" "factor" "factor"
然后,我尝试估算和查看数据,但是我得到的原始数据集却仍然缺少数据点,而不是插入估算值。
data.imp <- missForest(data)
data.imp$ximp
a b c
1 2 3
4 5
7 8 9
上面的示例显示了如何导入数据并将其转换为factor并尝试估算丢失的数据。下面的示例是一个可复制的示例,它会产生相同的问题。
我正在使用R版本3.5.3(2019-03-11)
#install and load the missForest package and library
install.packages("missForest")
library(missForest)
#create the test data frame with a missing value in column c
a <- c("1","4","7")
b <- c("2","5","8")
c <- c("3","","9")
data.test <- data.frame(a,b,c)
#print the data
data.test
#view the class of the data to ensure it is "factor"
missForest::varClass(data.test)
#create the imputed data frame using missForest
data.test.imp <- missForest(data.test)
#print the imputed data frame
data.test.imp$ximp
上面的代码返回以下内容,但c列中的值仍然丢失
> data.test
a b c
1 1 2 3
2 4 5
3 7 8 9
> missForest::varClass(data.test)
[1] "factor" "factor" "factor"
> data.test.imp <- missForest(data.test)
missForest iteration 1 in progress...done!
missForest iteration 2 in progress...done!
> data.test.imp$ximp
a b c
1 1 2 3
2 4 5
3 7 8 9
如果我将所有数据都转换为数字,它将插值到缺少的数据点,尽管这些插值是十进制,而我的所有数据都是整数,但仍然有效...
我正在使用的真实数据集要大得多,但是我遇到了完全相同的问题。
[此外,如果我遵循missForest手册中的示例,使用了虹膜数据集,那么一切都会正常进行。但是,如果我从UCI存储库下载相同的数据集并手动删除分类数据点并尝试运行相同的代码,则它将不起作用。
我确定我缺少一些未成年人,但是经过数小时的努力我发现自己被卡住了。
这似乎确实是一个小问题。在您的data.test
中,您有空字符串,需要将其编码为丢失。
您可以使用str
进行测试:
str(data.test)
# 'data.frame': 3 obs. of 3 variables:
# $ a: Factor w/ 3 levels "1","4","7": 1 2 3
# $ b: Factor w/ 3 levels "2","5","8": 1 2 3
# $ c: Factor w/ 3 levels "","3","9": 2 1 3
您看到,变量c
的级别包含""
,它也被编码为类别。
您可以轻松解决此问题
data.test[data.test == ""] <- NA
data.test
# a b c
# 1 1 2 3
# 2 4 5 <NA>
# 3 7 8 9
现在,missForest
有效:
data.test.imp <- missForest::missForest(data.test)
data.test.imp$ximp
# a b c
# 1 1 2 3
# 2 4 5 9
# 3 7 8 9