2010-09-24 1 views
4

J'ai généré un fichier qui contient une valeur logique "TRUE" ou "FALSE" sur chaque ligne. Maintenant, je voudrais lire les données logiques à partir du fichier dans R. Cependant, les données qui sont lues sont de mode "caractère" pas des valeurs logiques. Je me demandais comment lire les données en tant que valeurs logiques du fichier.Comment lire les données logiques d'un fichier dans R

Mon code R est

cat(FALSE,"\n", file="1.txt", append=FALSE); 
for (i in 2:5) cat(TRUE,"\n",file="1.txt", append=TRUE); 
a=scan(file="1.txt", what="logical") 

La sortie est:

> mode(a) 
[1] "character" 
> mode(a[1]) 
[1] "character" 
> a[1] 
[1] "FALSE" 

Je veux un [1] pour être la valeur logique.

Merci pour votre intérêt!

Répondre

7

Ah, maintenant je comprends. Vous devez lire très attentivement ?scan pour voir que ce que vous avez fait n'est pas ce que scan() veut pour l'argument what. J'ai raté cette première fois et je me suis demandé pourquoi votre code ne fonctionnait pas. Cette section est la clé:

what: the type of ‘what’ gives the type of data to be read. The 
     supported types are ‘logical’, ‘integer’, ‘numeric’, 
     ‘complex’, ‘character’, ‘raw’ and ‘list’. 

et la phrase clé est de type. Donc, vous devez passer un objet du type correct à l'argument what.

Dans votre exemple:

> typeof("logical") 
[1] "character" 

Ainsi scan() lit dans un objet de type "character".

La solution consiste simplement à utiliser what = TRUE, ou bien tout ce que R considère logique (voir les commentaires à cette réponse), au lieu

> typeof(TRUE) 
[1] "logical" 
> ## or 
> typeof(logical()) 
[1] "logical" 

## So now read in with what = TRUE 
> a <- scan(file="1.txt", what = TRUE) 
Read 5 items 
> class(a) 
[1] "logical" 
> typeof(a) 
[1] "logical" 

read.table() est plus logique dans la façon dont vous lui dites ce que les données soient lire dans sont. L'appel équivalent il y aurait:

> b <- read.table("1.txt", colClasses = "logical")[,] 
> class(b) 
[1] "logical" 
> typeof(b) 
[1] "logical" 

HTH

+0

Comme 'quoi 'on pourrait utiliser' NA' car 'typeof (NA)' est 'logical'. Et pour les autres types, des 'NA' spéciaux pourraient être utilisés:' NA_integer_', 'NA_real_',' NA_character_', 'NA_complex_'. – Marek

+3

Ou bon vieux 'logique (0)' ... Je pense que c'est le plus logique à utiliser. – mbq

+0

@mbq Votre façon est meilleure façon :) – Marek

3

Utilisez a=='TRUE'->a.

+0

Cela fonctionne bien lorsqu'ils traitent avec des types de données non standard logique; dites «Oui»/«Non», «7/-5» ou simplement «vrai»/«faux». – mbq