【问题标题】:import specific rows from "txt" into R将特定行从“txt”导入 R
【发布时间】:2016-02-17 18:03:34
【问题描述】:

我有一个“example.txt”文件,如下:

SIGNAL: 40 41 42                                            
0.406   0.043   0.051   0.021   0.013                   
0.056   0.201   0.026   0.009   0.000                   
0.000   0.128   0       0.009   0.000                               
TOTAL: 0.657                                            
SIGNAL: 44 45 46 48                                         
0.128   0.338   0.026                       
0.333   0.03    0.000                           
0.060   0.013   0.004                           
0.009   0.017   0.009                           
0.013   0       0.000                           
TOTAL: 0.704                                            
SIGNAL: 51 52 54                                            
0.368   0.081   0.085   0.004                       
0.162   0.09    0.064   0.073                       
0.013   0.017   0.009   0.000                       
TOTAL: 0.266                                            
SIGNAL: 60 61 62 63 64 65 66 67                                         
0.530   0.030                                   
0.009   0.179                                   
0.154   0.004                                   
0.068   0.009                                   
TOTAL: 0.796    

我想将 "SIGNAL: 44 45 46 48" 和 "TOTAL: 0.704" 之间的行导入 R,我使用 read.table("example.txt",skip=6 ,nrow=5) 提取这些特定行,它可以工作。

     V1    V2    V3
1 0.128 0.338 0.026
2 0.333 0.030 0.000
3 0.060 0.013 0.004
4 0.009 0.017 0.009
5 0.013 0.000 0.000

但是,我的真实数据(有 450,000 行)非常大,如果我想提取“SIGNAL: 3000 3001 3002 3003”和下一个“TOTAL”之间的行,我该怎么办?非常感谢!

【问题讨论】:

  • 在显示的示例中,列数在某些情况下是不同的。对于行之间的每组 SIGNAL/TOTAL,您希望作为单个数据集还是不同的数据集?
  • read.table(text = grep("^(SIGNAL|TOTAL)", readLines(file), invert = TRUE, value = TRUE), fill = TRUE) 是你想要的吗?
  • 如果我们需要单独的数据集,我们读取带有readLines .i.e 的.txt 文件。 lines <- readLines('yourfile.txt'); Map(function(i,j) read.table(text=lines[(i+1):(j-1)], sep='', header=FALSE), grep('SIGNAL', lines), grep('TOTAL', lines))
  • @akrun 谢谢! “readline”太棒了,你帮我输出了所有的集合,但是我的大数据怎么只能得到两个集合。例如,我只想提取“SIGNAL:3000 3001 3002 3003”和下一个“TOTAL”之间的行以及“SIGNAL:154 155 157”和下一个“TOTAL”之间的行,我该如何输出这两个结果列表形式?
  • @RichardScriven 谢谢!您帮助我以统一的方式输出所有数据,但实际上我只想提取“SIGNAL:3000 3001 3002 3003”和下一个“TOTAL”之间的行以及“SIGNAL:154 155 157”和下一个“之间的行”全部的”。我该怎么办呢,谢谢!

标签: r import


【解决方案1】:

我已经根据 akrun 的代码解决了这个问题。例如,我想提取前两组。我可以使用:

lines <- readLines('example.txt')
g<-c(40,44)
sapply(1:length(g), function(x){Map(function(i,j) read.table(text=lines[(i+1):(j-1)], sep='', header=FALSE), grep(paste('SIGNAL:',g[x]), lines), grep('TOTAL', lines)[which(grep(paste('SIGNAL:',g[x]), lines)==grep('SIGNAL', lines))])})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多