如何永久删除所有NA?

时间:2018-11-30 22:55:00

标签: r imputation

我正在估算缺少的变量。该功能最初似乎起作用:

True

输出:以前在NA点中具有“ None”的数据框。这是输出的一部分。

胡同BsmtQual BsmtCond BsmtExposure BsmtFinType1 BsmtFinSF1 BsmtFinType2

# Replace NA with "None"

vars_to_none = c("Alley", "BsmtQual", "BsmtCond", "BsmtExposure", "BsmtFinType1", "BsmtFinSF1", "BsmtFinType2", "FireplaceQu", "GarageType", "GarageYrBlt", "GarageFinish", "GarageQual", "GarageCond", "PoolQC", "Fence", "MiscFeature", "MasVnrType")

sapply(combi %>% select(vars_to_none), function(x) x = ifelse(is.na(x), "None", x))

到目前为止很好。

但是当我再次检查NA时...

[1,] "None" "Gd"     "TA"     "No"         "GLQ"        "706"      "Unf"       
[2,] "None" "Gd"     "TA"     "Gd"         "ALQ"        "978"      "Unf"       
[3,] "None" "Gd"     "TA"     "Mn"         "GLQ"        "486"      "Unf"       
[4,] "None" "TA"     "Gd"     "No"         "ALQ"        "216"      "Unf" 

...我得到2000多个条目。 head()显示相同的内容:

which(is.na(combi$Alley))

[1]不适用不适用不适用不适用

我尝试将sapply函数保存到combi,这导致了我不熟悉的错误。

head(combi$Alley)

combi $ Alley错误:$运算符对于原子向量无效

combi <- sapply(combi %>% select(vars_to_none), function(x) x = ifelse(is.na(x), "None", x))
head(combi$Alley)

combi $ Alley错误:$运算符对于原子向量无效

如何获取组合数据框以永久保存用“无”替换NA?

2 个答案:

答案 0 :(得分:1)

您提供的代码的第一手工作并没有分配回combi,因此combi将不受这些计算的影响。

需要这样做:

combi[vars_to_non] <- sapply(combi %>% select(vars_to_none), 
                              function(x) x = ifelse(is.na(x), "None", x))

我不会使用tidyverse-base混合代码,所以会回答:

combi[vars_to_non] <- lapply( combi[vars_to_non] , 
                              function(x) { x[is.na(x)] <- "None"; x}

我不确定结果是否会有所不同,但我怀疑我的版本会更有效,因为它不需要构建x列长度的多个向量。

第二个尝试失败了,因为sapply的默认值是一个矩阵,并且您将所有combi替换为您修改的列的矩阵化版本。 R中的矩阵只是具有维数的原子向量。

答案 1 :(得分:1)

以下内容会将NA数据框中的所有"None"替换为combi字符串。

combi2 <- combi %>% 
  mutate_all(funs(str_replace_na(., 'None')))