Как читать в текстовом файле на R с использованием textConnection и библиотеки (sqldf) - PullRequest
3 голосов
/ 23 февраля 2010

Я пытаюсь прочитать текстовый файл в R, чтобы я мог использовать функции sqldf. Я следую этому примеру, https://stat.ethz.ch/pipermail/r-help/2008-January/152040.html,, но у меня есть текстовый файл, содержащий мои данные вместо данных, которые вставляются, как в примере. Мой текстовый файл ниже:

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

Я попробовал это по примеру

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

Я вижу, что проблема в том, что textConnection должен принимать символьный вектор, и я даю ему data.frame, но преобразовать его через as.character также не удается. В конечном счете, я хочу выполнить такой запрос:

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

Ответы [ 3 ]

6 голосов
/ 23 февраля 2010

Можно напрямую перейти в SQLITE с помощью read.csv.sql () ИЛИ read.csv2.sql () из пакета sqldf.

Из онлайн-руководства:

Ссылка

Пример 13. read.csv.sql и read.csv2.sql read.csv.sql является интерфейс к sqldf, который работает как read.csv в R за исключением того, что это также предоставляет аргумент sql = и не все из других аргументов read.csv являются поддерживается. Он использует (1) импорт SQLite средство через RSQLite для чтения ввода файл во временный диск на основе База данных SQLite, которая создается на муха. (2) Затем он использует предоставленный SQL-оператор, чтобы прочитать таблицу так создан в R. Как первый шаг импортирует данные непосредственно в SQLite не пройдя через R, он может справиться большие файлы, чем сам R может обрабатывать пока фильтры оператора SQL это до размера, который R может обрабатывать. Вот Пример 6c переделан с использованием этого объект:

# 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 голосов
/ 24 февраля 2010

Если ваши данные не так уж велики, read.table () прекрасно работает. Если у вас есть данные, вы можете найти read.table или read.csv немного медленными. В этом случае вы можете считывать данные непосредственно в sqlite из R с помощью пакета sqldf. Вот пример:

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

Несколько месяцев назад я написал личный анекдот о моем опыте использования этого метода .

По моему опыту, перетаскивание данных непосредственно в sqlite - это НАМНОГО быстрее, чем чтение в R. Но дополнительный код не стоит, если простой read.csv () или read.table () хорошо работает для вас.

4 голосов
/ 23 февраля 2010

В комментарии Анико есть почти все, что вам нужно (наряду с 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> 

Другими словами, если у вас есть данные в файле, читайте из файла. TextConnection полезен, если и когда у вас есть данные «прямо там» вместе с командой, как в электронном письме, на которое вы ссылались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...