我正在尝试将文本文件读入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");
答案 0 :(得分:6)
可以使用read.csv.sql()或sqldf包中的read.csv2.sql()直接进入SQLITE。
从在线手册:
示例13. read.csv.sql和 read.csv2.sql read.csv.sql是一个 sqldf的接口就像 R中的read.csv除了它之外 提供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")
答案 1 :(得分:6)
如果你的数据不是那么大,read.table()效果很好。如果你有数据,你可能会发现read.table或read.csv有点慢。在这种情况下,可以使用sqldf包直接从R读取数据到sqlite。这是一个例子:
library(sqldf)
f <- file(“test.table.1.0”)
bigdf <- sqldf(“select * from f”, dbname = tempfile(),
file.format = list(header = T, row.names = F))
几个月前我写了personal anecdote about my experience using this method。
根据我的经验,将数据直接拖入sqlite比将其读入R更快。但如果简单的read.csv()或read.table()适合您,则不值得使用额外的代码。
答案 2 :(得分:4)
Aniko的评论几乎满足您的所有要求(以及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非常有用。