【问题标题】:How can I ignore lines while reading a text file in R? [duplicate]在 R 中读取文本文件时如何忽略行? [复制]
【发布时间】:2018-01-17 20:27:42
【问题描述】:

我有一个包含数万行的文本文件,其间穿插着诸如2010 5 3 0 0 之类的时间戳。它们不一致,但 2 行是一致的。

如何导入 2 列(试用和编号),同时忽略具有这些时间戳的行?

a <- read.table('test.txt')

目前,我收到此错误:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
  line 5 did not have 2 elements

数据

 Trial  0.214526266019124
 Trial  0.213914388985549
 Trial  0.213886659329060
 Trial  0.213886587273578
2010  5  3  0  0
 Trial  0.213886587273578
 Trial  0.213256610071994
 Trial  0.213232963405967
 Trial  0.213232928149832
2011  2  3  0  0
 Trial  0.213886587273578
 Trial  0.213256610071994
 Trial  0.213232963405967
 Trial  0.213232928149832
 Trial  0.213886587273578
 Trial  0.213256610071994
 Trial  0.213232963405967
2011  2  6  0  0

【问题讨论】:

  • 我会使用readLines() 读取它,然后使用一些正则表达式命令将它们过滤掉。您可以使用sink()cat() 导出结果字符向量,以将其写回文本文件。更聪明的方法是使用命令行删除文本文件中的某些行。这应该是一个UNIX 相关问题,以帮助过滤您的数据。
  • 我在想 a) readlines b) 忽略没有trial的行...不确定它是否会起作用。正在尝试..
  • 看这篇文章,这回答了你的问题。 stackoverflow.com/a/25682303/5874001

标签: r


【解决方案1】:

您可以将read.table(或其他功能)与grep结合使用:

read.table(text=grep("Trial", readLines(path_to_your_file), value=TRUE))

这能解决您的问题吗?

【讨论】:

  • 这与我发布的链接中的答案(基本上)相同。您可能会争辩说 OP 发布了一个重复的问题。
  • 我正在准备答案,但没有看到您的评论,我们这里有一些更简单的东西,不是吗?
  • 是的,我猜是这样。确实是同一个想法,好一个!如果 OP 没有被标记为重复,那么您的答案应该是正确的。
  • 谢谢!简洁。我尝试过的是数据的一个子集,它可以工作,但是对于数千行来说它真的很慢......
  • 我认为在这里使用 readLines 并没有真正的解决方法。如果您担心速度,JeanVuda 的建议可能会更快,但是通常应该使用我在 OP 中的 cmets 中推荐的方法预先处理您的数据。
【解决方案2】:

如果您有 perl,您可以使用它进行数据清理并使用 pipe 在不离开 R 的情况下捕获输出。必须在 perl“单行”中转义正则表达式和引号,这使它有点奇怪,并且可能更好,因为它是自己的脚本。

这里到 perl 的管道可能比你需要的更复杂。 perl -lne 'print $1 if m/Trial (.*)/' 可能就足够了。下面捕获时间戳并将其附加到所有行,直到找到时间戳。 \W+ 匹配一个或多个空白字符,但需要从 R 的解析器中转义额外的转义并传递给 perl:\\W+\" 用于防止 R 认为我们给它的字符串已经结束,同时仍然允许在 perl 中使用字符串分隔符(可以在 perl 中使用 qq(..) 而不是 "...")。

a <- read.table(
   pipe("perl -lne  '
        BEGIN{$ts=\"0 0 0 0 0\"} 
        chomp; 
        if(/Trial\\W+(.*)/){ 
           print \"$1 $ts\" 
       } else {
         $ts=$_
      }' test.txt"))

对于示例数据,输出将是

         V1   V2 V3 V4 V5 V6
1 0.2145263    0  0  0  0  0
2 0.2139144    0  0  0  0  0
3 0.2138867    0  0  0  0  0
4 0.2138866    0  0  0  0  0
5 0.2138866 2010  5  3  0  0
6 0.2132566 2010  5  3  0  0
7 0.2132330 2010  5  3  0  0
8 0.2132329 2010  5  3  0  0

【讨论】:

  • 这是一个很好的答案。
【解决方案3】:
txt<-readLines("C:\\Users\\abc\\Desktop\\new2.txt")
table<-strsplit(txt[grepl("T",substr(txt,1,1))],split = "\\s\\s")
table<-do.call("rbind", table)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多