我的问题涉及如何在将数据导入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。
非常感谢任何帮助。
答案 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)
对您问题的评论描述如下:
因此,我猜测您的数据类似于此问题末尾的示例数据。
如果是这种情况,您可以使用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"