web-dev-qa-db-fra.com

Existe-t-il un moyen d'utiliser read.csv pour lire à partir d'une valeur de chaîne plutôt que d'un fichier dans R?

J'écris un package R où le code R parle à une application Java. L'application Java génère une chaîne au format CSV et je veux que le code R être capable de lire directement la chaîne et de la convertir en un data.frame.

74
tommy chheng

Modification d'une réponse vieille de 7 ans: À présent, c'est beaucoup plus simple grâce à l'argument text= Qui a été ajouté à read.csv() et pareil:

R> data <- read.csv(text="flim,flam
+ 1.2,2.2
+ 77.1,3.14")
R> data
  flim flam
1  1.2 2.20
2 77.1 3.14
R> 

Oui, regardez l'aide de textConnection() - la notion très puissante dans R est que pratiquement tous les lecteurs (comme par exemple read.table() et ses variantes) y accèdent connexion objet qui peut être un fichier, ou une URL distante, ou un tuyau provenant d'une autre application, ou ... du texte comme dans votre cas.

La même astuce est utilisée pour les documents dits ici:

> lines <- "
+ flim,flam
+ 1.2,2.2
+ 77.1,3.14
+ "
> con <- textConnection(lines)
> data <- read.csv(con)
> close(con)
> data
  flim flam
1  1.2 2.20
2 77.1 3.14
> 

Notez que c'est une façon simple de construire quelque chose mais c'est aussi coûteux en raison de l'analyse répétée de toutes les données. Il existe d'autres façons de passer de Java à R, mais cela devrait vous permettre de démarrer rapidement. L'efficacité vient ensuite ...

104
Dirk Eddelbuettel

Notez que dans les versions actuelles de R, vous n'avez plus besoin de la textConnection(), il est possible de faire simplement ceci:

> states.str='"State","Abbreviation"
+ "Alabama","AL"
+ "Alaska","AK"
+ "Arizona","AZ"
+ "Arkansas","AR"
+ "California","CA"'
> read.csv(text=states.str)
       State Abbreviation
1    Alabama           AL
2     Alaska           AK
3    Arizona           AZ
4   Arkansas           AR
5 California           CA
77
Adam Bradley

Oui. Par exemple:

string <- "this,will,be\na,data,frame"
x <- read.csv(con <- textConnection(string), header=FALSE)
close(con)
#> x
#    V1   V2    V3
#1 this will    be
#2    a data frame
4
Joshua Ulrich

Supposons que vous ayez un fichier appelé tommy.csv (oui, imaginatif, je sais ...) qui a le contenu de

col1 col2\n 1 1\n 2 2\n 3 3

où chaque ligne est séparée par un caractère d'échappement "\ n".

Ce fichier peut être lu à l'aide de l'argument allowEscapes dans read.table.

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE)

  col1 col2
1 col1 col2
2    1    1
3    2    2
4    3    3

Ce n'est pas parfait (modifier les noms des colonnes ...), mais c'est un début.

1
Roman Luštrik

Cette fonction enveloppe la réponse de Dirk sous une forme pratique. C'est génial pour répondre aux questions sur SO, où le demandeur vient de vider les données à l'écran.

text_to_table <- function(text, ...)
{
   dfr <- read.table(tc <- textConnection(text), ...)
   close(tc)
   dfr
}

Pour l'utiliser, copiez d'abord les données à l'écran et collez-les dans votre éditeur de texte.

foo bar baz
1 2 a
3 4 b

Maintenant, enveloppez-le avec text_to_table, des citations et tout autre argument pour read.table.

text_to_table("foo bar baz
1 2 a
3 4 b", header = TRUE)
0
Richie Cotton