在R中导入数据集时跳过元数据

时间:2015-03-16 07:18:46

标签: r sqldf

我的问题涉及如何在将数据导入R时跳过文件开头的元数据。我的数据是.txt格式,其中第一行 是描述数据的元数据,需要过滤掉这些数据。 下面是制表符分隔格式的数据框的最小示例:

Type=GenePix Export                         
DateTime=2010/03/04 16:04:16                        
PixelSize=10                        
Wavelengths=635                     
ImageFiles=Not Saved                        
NormalizationMethod=None                        
NormalizationFactors=1                      
JpegImage=                      
StdDev=Type 1                       
FeatureType=Circular                        
Barcode=                        
BackgroundSubtraction=LocalFeature                      
ImageOrigin=150, 10                     
JpegOrigin=150, 2760                        
Creator=GenePix Pro 7.2.29.002                      
var1    var2    var3    var4    var5    var6    var7
1   1   1   molecule1   1F3 400 4020
1   2   1   molecule2   1B5 221 4020
1   3   1   molecule3   1H5 122 2110
1   4   1   molecule4   1D1 402 2110
1   5   1   molecule5   1F1 600 4020

如果我知道实际数据的起始行,我可以使用下面显示的基本命令:

mydata <- read.table("mydata.txt",header=T, skip=15)

哪会回来;

mydata
  var1 var2 var3      var4 var5 var6 var7
1    1    1    1 molecule1  1F3  400 4020
2    1    2    1 molecule2  1B5  221 4020
3    1    3    1 molecule3  1H5  122 2110
4    1    4    1 molecule4  1D1  402 2110
5    1    5    1 molecule5  1F1  600 4020

问题是我需要编写一个可以读取各种数据集的脚本,其中实际数据的起始行号不同于一个 数据设置为另一个。我可以想象使用类似sqldf包的东西,但我不太熟悉sql。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

如何使用已有的函数读取DNA微阵列数据?这些可在Bioconductor项目开发的软件包中找到。

例如,大概是这样的

library(limma)

mydata<-read.maimages("mydata.txt", source="genepix")

有关更多示例,请参阅limma manual。它可以很容易地导入大多数DNA微阵列格式。

答案 1 :(得分:3)

您可以使用count.fields()来确定skip参数。我将您的文件称为"x.txt"

read.table("x.txt", skip = which.max(count.fields("x.txt") == 7) - 1, 
    header = TRUE)
#   var1 var2 var3      var4 var5 var6 var7
# 1    1    1    1 molecule1  1F3  400 4020
# 2    1    2    1 molecule2  1B5  221 4020
# 3    1    3    1 molecule3  1H5  122 2110
# 4    1    4    1 molecule4  1D1  402 2110
# 5    1    5    1 molecule5  1F1  600 4020

因此,这会在第一次出现七个字段时开始读取文件

答案 2 :(得分:1)

假设所有文件都有Creator作为最后一个元数据行,

read.table(pipe("awk 'NR ==1, /Creator/ {next}{print}' mydata.txt"),
              header=TRUE)
#  var1 var2 var3      var4 var5 var6 var7
#1    1    1    1 molecule1  1F3  400 4020
#2    1    2    1 molecule2  1B5  221 4020
#3    1    3    1 molecule3  1H5  122 2110
#4    1    4    1 molecule4  1D1  402 2110
#5    1    5    1 molecule5  1F1  600 4020

如果您知道列数,也可以

read.table(pipe("awk 'NF==7{print}' mydata.txt"), header=TRUE)
#  var1 var2 var3      var4 var5 var6 var7
#1    1    1    1 molecule1  1F3  400 4020
#2    1    2    1 molecule2  1B5  221 4020
#3    1    3    1 molecule3  1H5  122 2110
#4    1    4    1 molecule4  1D1  402 2110
#5    1    5    1 molecule5  1F1  600 4020

更新

如果我们需要从第一次出现的“var1&#39;到文件的末尾,

  read.table(pipe("awk '/var1/ { matched = 1}matched { print }' mydata.txt"), 
             header=TRUE)    
 #   var1 var2 var3      var4 var5 var6 var7
 #1    1    1    1 molecule1  1F3  400 4020
 #2    1    2    1 molecule2  1B5  221 4020
 #3    1    3    1 molecule3  1H5  122 2110
 #4    1    4    1 molecule4  1D1  402 2110
 #5    1    5    1 molecule5  1F1  600 4020

上述解决方案在linux系统上运行良好。在Windows上,它失败了(根据评论)。可以在两个系统上运行的选项是

 lines <- readLines('mydata.txt')
 read.table(text=lines[grep('var1', lines):length(lines)],header=TRUE)
 #   var1 var2 var3      var4 var5 var6 var7
 #1    1    1    1 molecule1  1F3  400 4020
 #2    1    2    1 molecule2  1B5  221 4020
 #3    1    3    1 molecule3  1H5  122 2110
 #4    1    4    1 molecule4  1D1  402 2110
 #5    1    5    1 molecule5  1F1  600 4020

答案 3 :(得分:1)

基于实际数据中存在制表的解决方案(而不是元数据中的解决方案)。作为“奖金”,您可以选择显示(通过cat任何被视为元数据的行。)

主要阅读功能

read.genepix <- function(filename, disp.meta = FALSE) {

    infile <- file(description = filename, open = "r" )

    # create a meta indicator function
    is.meta <- function(text) !grepl(pattern = "\\t", x = text)

    # Prepare to store meta text (if needed)
    meta.text <- c()
    meta <- TRUE

    while(isTRUE(meta)) {

        last.pos <- seek(infile, where = NA)
        current.line <- readLines(infile, n = 1)
        meta <- is.meta(current.line)

        if(isTRUE(meta)) {
            meta.text <- append(meta.text, current.line)
        } else {
            seek(infile, where = last.pos)
            data.txt <- paste0(readLines(infile),collapse="\n")
            close(infile)
            break
        }
    }

    if(isTRUE(disp.meta)) {
        cat(paste(meta.text, collapse="\n"))
    }

    return(read.table(text=data.txt, header = TRUE, sep = "\t", quote=""))
}

用法/结果

my.data <- read.genepix("somefile.txt")

my.data

#   var1 var2 var3      var4 var5 var6 var7
# 1    1    1    1 molecule1  1F3  400 4020
# 2    1    2    1 molecule2  1B5  221 4020
# 3    1    3    1 molecule3  1H5  122 2110
# 4    1    4    1 molecule4  1D1  402 2110
# 5    1    5    1 molecule5  1F1  600 4020
此答案中使用的

示例数据(以“somefile.txt”的形式保存到磁盘) - 但请注意,SO会将数据部分中的一系列空格替换为选项卡 - 因此在文本编辑器中我需要用表格替换这些空格,以使代码有效。

capture.output(cat("Type=GenePix Export
DateTime=2010/03/04 16:04:16
PixelSize=10
Wavelengths=635
ImageFiles=Not Saved
NormalizationMethod=None
NormalizationFactors=1
JpegImage=
StdDev=Type 1
FeatureType=Circular
Barcode=
BackgroundSubtraction=LocalFeature
ImageOrigin=150, 10
JpegOrigin=150, 2760
Creator=GenePix Pro 7.2.29.002
var1    var2    var3    var4    var5    var6    var7
1   1   1   molecule1   1F3 400 4020
1   2   1   molecule2   1B5 221 4020
1   3   1   molecule3   1H5 122 2110
1   4   1   molecule4   1D1 402 2110
1   5   1   molecule5   1F1 600 4020
"), file="somefile.txt")

答案 4 :(得分:1)

对您问题的评论描述如下:

  1. 元数据部分不包含任何标签
  2. 数据部分以制表符分隔
  3. 因此,我猜测您的数据类似于此问题末尾的示例数据。

    如果是这种情况,您可以使用fread的魔力来自动确定数据的开始位置。

    这是一个演示:

    cat(A, file = "mytest.txt", sep = "\n")
    library(data.table)
    fread("mytest.txt")
    #    var1 var2 var3      var4 var5 var6 var7
    # 1:    1    1    1 molecule1  1F3  400 4020
    # 2:    1    2    1 molecule2  1B5  221 4020
    # 3:    1    3    1 molecule3  1H5  122 2110
    # 4:    1    4    1 molecule4  1D1  402 2110
    # 5:    1    5    1 molecule5  1F1  600 4020
    

    示例数据

    A <- c("Type=GenePix Export", "DateTime=2010/03/04 16:04:16", "PixelSize=10", 
    "Wavelengths=635", "ImageFiles=Not Saved", "NormalizationMethod=None", 
    "NormalizationFactors=1", "JpegImage=", "StdDev=Type 1", "FeatureType=Circular", 
    "Barcode=", "BackgroundSubtraction=LocalFeature", "ImageOrigin=150, 10", 
    "JpegOrigin=150, 2760", "Creator=GenePix Pro 7.2.29.002", 
    "var1\tvar2\tvar3\tvar4\tvar5\tvar6\tvar7", 
    "1\t1\t1\tmolecule1\t1F3\t400\t4020", "1\t2\t1\tmolecule2\t1B5\t221\t4020", 
    "1\t3\t1\tmolecule3\t1H5\t122\t2110", "1\t4\t1\tmolecule4\t1D1\t402\t2110", 
    "1\t5\t1\tmolecule5\t1F1\t600\t4020")
    
    A
    #  [1] "Type=GenePix Export"               
    #  [2] "DateTime=2010/03/04 16:04:16"      
    #  [3] "PixelSize=10"                      
    #  [4] "Wavelengths=635"                   
    #  [5] "ImageFiles=Not Saved"              
    #  [6] "NormalizationMethod=None"          
    #  [7] "NormalizationFactors=1"            
    #  [8] "JpegImage="                        
    #  [9] "StdDev=Type 1"                     
    # [10] "FeatureType=Circular"              
    # [11] "Barcode="                          
    # [12] "BackgroundSubtraction=LocalFeature"
    # [13] "ImageOrigin=150, 10"               
    # [14] "JpegOrigin=150, 2760"              
    # [15] "Creator=GenePix Pro 7.2.29.002"    
    # [16] "var1\tvar2\tvar3\tvar4\tvar5\tvar6\tvar7"
    # [17] "1\t1\t1\tmolecule1\t1F3\t400\t4020"      
    # [18] "1\t2\t1\tmolecule2\t1B5\t221\t4020"      
    # [19] "1\t3\t1\tmolecule3\t1H5\t122\t2110"      
    # [20] "1\t4\t1\tmolecule4\t1D1\t402\t2110"      
    # [21] "1\t5\t1\tmolecule5\t1F1\t600\t4020"