如何永久删除所有 NA?

How to permanently remove all NAs?

我正在估算缺失的变量。该功能最初似乎有效:

# 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 点中具有 "None" 的数据框。这是输出的一部分。

Alley BsmtQual BsmtCond BsmtExposure BsmtFinType1 BsmtFinSF1 BsmtFinType2

[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" 

到目前为止还不错。

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

which(is.na(combi$Alley))

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

head(combi$Alley)

[1] 呐呐呐呐呐呐呐

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

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

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

> which(is.na(combi$Alley))

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

如何让组合数据框永久保存 NA 的替换 "None"?

您提供的代码的第一次尝试没有分配给 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 中的矩阵只是具有维度的原子向量。

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

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