如何永久删除所有 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')))
我正在估算缺失的变量。该功能最初似乎有效:
# 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')))