No dataframe abaixo que possui colunas apenas com valores numéricos, quero encontrar ou NAs
"N/A" de cada coluna e substituí-los pelo valor médio do restante das linhas de cada coluna
data <- structure(list(`Review Star` = c("N/A", "5", "5", "4", NA, "5",
"3.4", NA), `Total Review` = c("N/A", "1", "5", "5", NA, "1",
"5", NA)), row.names = c(NA, -8L), class = c("tbl_df", "tbl",
"data.frame"))
library(dplyr)
data <- data %>%
mutate_all(~ifelse(. %in% c("N/A", "NA"), mean(., na.rm = TRUE), .))
O
zoo
pacote possui umana.aggregate
função para esse fim ("Substituir NA por agregação"). Como você tem um caractere"N/A"
, precisará converter seus dados em numéricos usandoas.numeric
, o que definirá o caractere"N/A"
como padrãoNA
:Ou, alternativamente, usando
sapply
e especificando as colunas específicas:É assim que eu faria de uma só vez
dplyr
. Usandotype.convert
para converter para numérico facilmente e depoismutate
+replace
.Ou em combinação com
imputeTS::na_mean
ouzoo::na.aggregate
:Mantendo-se próximo de sua solução original, você teve alguns problemas:
as.numeric
is.na()
para encontrar NAs porque a string "NA" não equivale a NA~
requer o uso de.x
anotação em vez de.
Então a solução fica assim: