在R中读取,子集“选择”并写入txt文件

时间:2018-07-23 11:17:37

标签: r

我想从file1.txt中选择一部分并将其保存在另一个名为file2.txt的文件中。 File1.txt:

abc 1 6 a
abc 2 7 b
efg 3 8 c
abc 4 9 d
efg 5 10 e

我要在此处应用的数据库查询是(不是特定于语法的):

file2.txt <- select col2, col3, col4 from file1.txt where col1=abc

File2.txt:

1 6 a
2 7 b
4 9 d

有什么方法可以在R中对文本文件应用数据库类型查询?我知道我们可以使用grep()函数在.txt文件中搜索字母。但是我找不到任何在线帮助吗?有谁知道我该如何解决我的问题?先感谢您 :) 请不要将此问题标记为重复:

  

Searching for string within a text file in R

这个问题有所不同。此外,我不能使用sqldf,因为此软件包不适用于.txt文件。

3 个答案:

答案 0 :(得分:1)

以下内容是否有助于回答csvfile中的子集数据?

library(sqldf);
read.csv.sql(file, sql = "select * from file", header = TRUE, sep = ",")

说明 将文件读取到R中,并使用sql语句对其进行过滤。 R仅处理滤波后的部分,因此 可以容纳大于R可以处理的文件。

答案 1 :(得分:1)

这应该是所需要的,记住like()包中的data.table在内部使用grepl,所以我认为正则表达式也是一个选择。

library(data.table)
# Depending on the characteristics of the csv file this call has to be adjusted
dt <- data.table(read.csv("File1.txt", header = FALSE, sep = " "))
# or
dt <- fread("test.txt")
# data.table looks like this after import
dt <- structure(list(V1 = structure(c(1L, 1L, 2L, 1L, 2L)
      , .Label = c("abc", "efg")
      , class = "factor")
      , V2 = 1:5
      , V3 = 6:10
      , V4 = structure(1:5, .Label = c("a", "b", "c", "d", "e")
      , class = "factor")), row.names = c(NA, -5L)
      , class = c("data.table", "data.frame"))

write.csv(dt[like(V1, "abc"), .(V2
                      , V3
                      , V4
                      )],file = "File2.txt", row.names = FALSE)

答案 2 :(得分:1)

假设文件在末尾的注释中可重复创建:

library(sqldf)

read.csv.sql("File1.txt", 
  "select V2, V3, V4 from file where V1 = 'abc'", header = FALSE, sep = " ")

给予:

  V2 V3 V4
1  1  6  a
2  2  7  b
3  4  9  d

注意

Lines <- "abc 1 6 a
abc 2 7 b
efg 3 8 c
abc 4 9 d
efg 5 10 e
"
cat(Lines, file = "File1.txt")