2010-02-23 1 views
3

J'essaye de lire un fichier texte dans R afin que je puisse utiliser les fonctions sqldf. Je suis cet exemple, https://stat.ethz.ch/pipermail/r-help/2008-January/152040.html, mais j'ai un fichier texte contenant mes données au lieu des données collées comme l'exemple l'a. Mon fichier texte est ci-dessous:Comment lire dans un fichier texte à R en utilisant textConnection et library (sqldf)

#"test.table.1.0" file has this contents: 
id Source 
1  A10 
2  A32 
3  A10 
4  A25 

J'ai essayé en suivant l'exemple

test_table <- read.table(textConnection("test.table.1.0")) 

Je peux voir que le problème est que textConnection est censé prendre un vecteur de caractère, et je lui donne un data.frame, mais la conversion via as.character échoue également. En fin de compte, je veux exécuter une requête comme ceci:

sqldf("select test_table.source from test_table"); 
+3

Que diriez-vous de 'read.table (file =" test.table.1.0 ")'? – Aniko

Répondre

4

commentaire de Aniko a presque tout ce que vous avez besoin (avec header=TRUE):

R> data <- read.table("test.table.1.0", header=TRUE) 
R> data 
    id Source 
1 1 A10 
2 2 A32 
3 3 A10 
4 4 A25 
R> 

En d'autres termes, si vous avez les données dans un fichier , lisez d'un fichier. Un textConnection est utile si et quand vous avez les données 'juste là' avec la commande comme dans l'email que vous avez référencé.

+0

Merci, je n'ai pas réalisé la fonction de textConnection. J'ai aussi eu un commentaire supplémentaire dans mon SQL, maintenant supprimé. – John

6

On peut aller directement dans SQLITE en utilisant read.csv.sql() OU read.csv2.sql() du paquet sqldf.

A partir du manuel en ligne:

Link

Exemple 13. read.csv.sql et read.csv.sql read.csv2.sql est une interface à sqldf qui fonctionne comme read.csv dans R excepté que fournit également un argument sql = et que tous les autres arguments de read.csv ne sont pas pris en charge par . Il utilise (1) l'installation d'importation de SQLite via RSQLite pour lire le fichier d'entrée dans une base de données SQLite basée sur disque temporaire qui est créée sur la mouche. (2) Ensuite, il utilise la condition instruction SQL pour lire la table si créé dans R. Comme la première étape importe les données directement dans SQLite sans passer par R, il peut gérer des fichiers plus volumineux que R lui-même peut gérer comme tant que l'instruction SQL filtre à une taille que R peut gérer. Ici est Exemple 6c refait à neuf en utilisant cette installation :

# Example 13a. 
library(sqldf) 

write.table(iris, "iris.csv", sep = ",", quote = FALSE, row.names = FALSE) 
iris.csv <- read.csv.sql("iris.csv", 
     sql = "select * from file where Sepal_Length > 5") 

# Example 13b. read.csv2.sql. Commas are decimals and ; is sep. 

library(sqldf) 
Lines <- "Sepal.Length;Sepal.Width;Petal.Length;Petal.Width;Species 
5,1;3,5;1,4;0,2;setosa 
4,9;3;1,4;0,2;setosa 
4,7;3,2;1,3;0,2;setosa 
4,6;3,1;1,5;0,2;setosa 
" 
cat(Lines, file = "iris2.csv") 

iris.csv2 <- read.csv2.sql("iris2.csv", sql = "select * from file where Sepal_Length > 5") 
6

Si vous êtes données ne sont pas tout ce que grand, read.table() fonctionne très bien. Si vous avez des concerts de données, vous pouvez trouver read.table ou read.csv être un peu lent. Dans ce cas vous pouvez lire les données directement dans sqlite à partir de R en utilisant le paquet sqldf. Voici un exemple:

library(sqldf) 
f <- file(“test.table.1.0”) 
bigdf <- sqldf(“select * from f”, dbname = tempfile(), 
    file.format = list(header = T, row.names = F)) 

Il y a quelques mois j'ai écrit un personal anecdote about my experience using this method. D'après mon expérience, tirer des données directement dans sqlite est beaucoup plus rapide que de les lire dans R. Mais cela ne vaut pas le code supplémentaire si un simple read.csv() ou read.table() fonctionne bien pour vous.