web-dev-qa-db-fra.com

read.csv champs vides à NA

J'ai un fichier texte délimité par des tabulations, nommé 'a.txt'. La colonne D est vide.

 A       B       C    D
10      20     NaN
30              40
40      30      20
20      NA      20

Je veux que la trame de données ressemble et agisse exactement comme le fichier texte, avec un espace dans la 2e ligne et dans la 2e colonne.

Malheureusement, read.csv convertit tous les blancs et NA en "NA". Je veux lire NA et NaN en tant que caractères.

 b<- read.csv("a.txt",sep="\t", skip =0, header = TRUE, comment.char = "",check.names = FALSE, quote="", )

Pour résumer: je veux répliquer les mêmes valeurs dans le fichier de sortie sans les modifier:

  • S'il y a un blanc en entrée, la sortie doit être vide.
  • Si l'entrée a NA ou Nan, la sortie doit également avoir NA ou NaN.
23
user1631306

Après avoir lu le fichier csv, essayez ce qui suit. Il remplacera les valeurs NA par "".

b[is.na(b)]<-""

Assez certain que cela ne fixera pas vos valeurs NaN. Cela devra être résolu dans une déclaration distincte

b[is.nan(b)]<-""
11
silly_penguin

La valeur par défaut de na.strings est simplement "NA", vous devrez donc peut-être ajouter "NaN". Les vrais blancs ("") sont définis comme manquants mais les espaces ("") ne le sont pas:

 b<- read.csv("a.txt",  skip =0,  
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

Ce n'est pas clair que c'est le problème car votre exemple de données est mal formé et n'a pas de virgules. Cela peut être le problème fondamental car read.csv ne permet pas la séparation des tabulations. Utilisation read.delim ou read.table si vos données sont séparées par des tabulations.

b<- read.table("a.txt", sep="\t" skip =0, header = TRUE, 
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

# worked example for csv text file connection
 bt <- "A,B,C  
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") )
 b
#--------------
   A  B  C
1 10 20 NA
2 30 NA 40
3 40 30 20
4 NA NA 20

Exemple 2:

bt <- "A,B,C,D
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") , colClasses=c(rep("numeric", 3), "logical")) 
 b
#----------------
   A  B  C  D
1 10 20 NA NA
2 30 NA 40 NA
3 40 30 20 NA
4 NA NA 20 NA
> str(b)
'data.frame':   4 obs. of  4 variables:
 $ A: num  10 30 40 NA
 $ B: num  20 NA 30 NA
 $ C: num  NA 40 20 20
 $ D: logi  NA NA NA NA

Il est légèrement intéressant que NA et NaN ne soient pas identiques pour les vecteurs numériques. NaN est retourné par des opérations qui n'ont aucune signification mathématique (mais comme indiqué dans la page d'aide que vous obtenez avec ?NaN, les résultats des opérations peuvent dépendre du système d'exploitation particulier. Les tests d'égalité ne sont appropriés ni pour NaN ni pour NA. Il existe pour eux des fonctions is spécifiques:

> Inf*0
[1] NaN

> is.nan(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE FALSE
> is.na(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE  TRUE  # note the difference
34
42-

Vous pouvez spécifier colClasses dans le read.csv instruction pour lire la colonne sous forme de texte.

2
TheComeOnMan

Utilisez l'argument na.string.
na.string est utilisé pour définir quels arguments doivent être lus comme valeur na à partir des données. Donc, si vous mentionnez

read.csv(text=bt, na.string = "abc")

alors où que ce soit dans vos données, il l'abc, il le convertira en na.
Comme abc ne se trouve pas dans vos données, il ne convertira aucune valeur en na.

0
Karan