J'ai un ensemble de données où les valeurs manquantes ont été codées avec un point. Je voudrais avoir des valeurs manquantes en blanc (NA).

Voici le bloc de données:

df <- data.frame(ITEM1 = c(6, 8, '.'),
                   ITEM2 = c(1, 6, 9),
                   ITEM3 = c(4, 2, 5),
                   ITEM4 = c('.', 3, 2),
                   ITEM5 = c(1, 6, 9)
)

df

ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1     6     1     4     .     1
2     8     6     2     3     6
3     .     9     5     2     9
> 
r na
2
Marie 4 mai 2021 à 05:23

3 réponses

Meilleure réponse

Les colonnes seront character la classe en raison de la présence de .. Créez un matrix logique avec == et attribuez ces éléments à NA, puis convertissez les colonnes Data.frame en son type approprié avec type.convert

df[df == "." & !is.na(df)] <- NA
df <- type.convert(df, as.is = TRUE)

Ou en une seule étape avec replace (qui fait l'affectation interne)

df <- type.convert(replace(df, df == "." & !is.na(df), NA), as.is = TRUE)

Ou une autre approche est

df[] <- lapply(df, function(x) replace(x x %in% '.', NA))
df <- type.convert(df, as.is = TRUE)

Généralement, cela peut être évité tous ensemble, tout en lisant les données I.E. Spécifiez na.strings = "." dans read.csv/read.table etc.

5
akrun 4 mai 2021 à 02:54

Vous pouvez utiliser la fonction na_if de dplyr. Notez que le point change le type de vos colonnes pour être char qui pourrait ne pas être ce que vous voulez après! Le code suivant trouve toutes les colonnes char, remplace . avec NA et convertit la colonne à numériser:

df <- df %>%
    mutate(across(where(is.character), ~as.numeric(na_if(., "."))))
2
Alex 4 mai 2021 à 08:04

Voici une alternativ avec set_na de sjlabelled package. NOTE Les colonnes resteront en tant que type de caractère.

library(sjlabelled)
set_na(df, na = ".", as.tag = FALSE)

Production:

ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1     6     1     4  <NA>     1
2     8     6     2     3     6
3  <NA>     9     5     2     9
3
TarJae 4 mai 2021 à 08:26