83 votes

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 paquet R où le code R communique avec une application Java. L'application Java produit une chaîne au format CSV et je veux que le code R soit capable de lire directement cette chaîne et de la convertir en un data.frame.

0 votes

Pourriez-vous utiliser le paquet rJava à la place ?

0 votes

Vous pourriez peut-être jouer avec allowEscapes (dans read.table). Assurez-vous simplement que la sortie java utilise \n pour casser les lignes.

0 votes

@Joshua J'utilise rJava pour parler à mon programme Java. Je pense qu'il est plus efficace de convertir mes objets Java lourds en chaînes de caractères avant de les transmettre à R.

123voto

Dirk Eddelbuettel Points 134700

Modification d'une réponse vieille de 7 ans : Maintenant, c'est beaucoup plus simple grâce à la text= qui a été ajouté à read.csv() et similaires :

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 pour textConnection() -- le très puissant La notion de R est qu'essentiellement tous les lecteurs (comme par ex. read.table() et ses variantes) accèdent à ces connexion qui peut être un fichier, une URL distante, un tube provenant d'une autre application, ou ... un 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 qu'il s'agit d'un simple pour 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 moyens de passer de Java à R, mais cela devrait vous permettre de vous lancer rapidement. L'efficacité vient ensuite...

8 votes

Les versions plus récentes de R ont un mécanisme plus simple, voir la réponse de @Adam Bradley dans ce fil de discussion : stackoverflow.com/a/16349171/17523

79voto

Adam Bradley Points 428

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

> 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

5 votes

Je sais que c'est un peu tard mais - il serait peut-être utile de soumettre ceci comme une modification de la réponse acceptée, puisqu'il est peu probable que le PO change maintenant la réponse acceptée, pourtant celle-ci semble maintenant être la meilleure réponse ?

1 votes

À mon avis, le PO devrait rejeter la réponse acceptée et accepter celle-ci...

4voto

Joshua Ulrich Points 68776

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

1voto

Roman Luštrik Points 19295

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

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 allowEscapes argument 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.

0voto

Richie Cotton Points 35365

Cette fonction met la réponse de Dirk sous une forme pratique. Elle est idéale pour répondre à des questions sur SO, où l'auteur de la question vient juste d'afficher 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 affichées à l'écran et collez-les dans votre éditeur de texte.

foo bar baz
1 2 a
3 4 b

Maintenant, enveloppez-la avec text_to_table les citations et tout autre argument en faveur de read.table .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X