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:
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)]<-""
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
Vous pouvez spécifier colClasses
dans le read.csv
instruction pour lire la colonne sous forme de texte.
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.