比较选项卡分隔文件中的列

时间:2011-09-14 12:03:50

标签: r memory-management csv

我有制表符分隔的文本文件。每个文件都有三列 - ProbeIDAvgsignalintenitiesPvalue。在进一步分析之前,我想确保ProbeID列中的数据正确无误。每个文件中的ProbeID列包含大约47,315个值,因此我关注性能。我已经包含了在Excel中打开的单个文件的屏幕截图。有效文件应该只有47,234个ProbeID。

如果您想了解更多信息,我可以立即为您提供。

我已经在r代码中给出了最少的信息。我有4个文件,其中file1的长度为10,而其他的是7,我想将所有这些文件一起传递到一个函数中并检查它们是否都是相同的长度..if not它应该返回一个特定文件(即文件1)长度不等的消息

file1=list(ProbeID=c(360450,1690139,5420594,3060411,450341,5420324,730162,4200739,1090156,7050341),X1234Avgintensity=c(110.3703,469.5097,407.557,123.9965   ,2234.529,190.7429,110.072,314.7892,153.486,160.4385),X1234Pvalue=c(0.8424522,0.01054713,0.01450231,0.5800923,0,0.1437047,0.8477257,0.02900461,0.286091,0.2406065))

file2=list(ProbeID=c(360450,1690139,5420594,3060411,450341,5420324,730162),X3456Avgintensity=c(110.3703,469.5097,407.557,123.9965,2234.529,190.7429,110.072),X3456Pvalue=c(0.8424522,0.01054713,0.01450231,0.5800923,0,0.1437047,0.8477257))

file3=list(ProbeID=c(360450,1690139,5420594,3060411,450341,5420324,730162),X678Avgintensity=c(66.78696,160.4022,207.996,80.48443,1187.988,91.58123,85.80681),X678Pvalue=c(0.9538563,0.02768622,0.01450231,0.6031641,0,0.313118,0.444298))

file4=list(ProbeID=c(360450,1690139,5420594,3060411,450341,5420324,730162),X8701Avgintensity=c(83.57081,141.5529,238.9153,98.10896,1060.654,97.65002,83.88175),X8701Pvalue=c(0.814766,0.03493738,0.005273566,0.3651945,0,0.3750824,0.808174))

3 个答案:

答案 0 :(得分:2)

我不认为47,315行特别大。所以我会这样做:

  1. 找到您满意的包含正确行数的文件。请阅读此文件,并致电f1
  2. 现在循环浏览其余文件,并将probeID列与f1中的正确列进行比较。记下有效的文件。循环浏览文件时,这里有一些提示:
    • 继续覆盖比较文件,即没有数据集f3f4f5。在任何时候,您应该只有f1和一个比较数据集。这样可以节省内存。
    • read.csv函数中,查看colClasses参数。查看示例数据集,colClasses=c("numeric", "numeric", "numeric")之类的内容应该可行。这样可以在读取数据时更快。
  3. <强>更新

    在编辑你的问题之后,你似乎对特定文件的行数感兴趣,所以这里有一些伪代码可以帮助你:

    fnames = list.files()
    no_of_lines = numeric(length(fnames))
    for(i in seq_along(fnames) {
        d = read.delim(fnames[i])
        no_of_lines[i] = dim(d)[1]
    }
    

    然后,您可以在plot

    上使用tableno_of_lines

答案 1 :(得分:1)

像科林说的那样,听起来你的数据文件并不是很大。使用system.time或其中一个性能分析包来查看每个文件的读取时间read.delim。如果它确实需要太长时间,那么请参阅这个问题,了解如何加快速度。

Quickly reading very large tables as dataframes in R

答案 2 :(得分:0)

您使用read.delim()读取制表符分隔的文件,它与read.table()read.csv()相同,但默认设置除外,它们设置为\t作为分隔符。

例如,

my.data <- read.delim('c:/path/to/my/file.txt')

获得数据后,您可以使用

计算行数
nrow(my.data)

如果检查有效性只是检查行数是47,234那么你可以做这样的事情

if(nrow(my.data) == 47234L) {
  do.something()
} else {
  do.something.else()
}

但是,您可能希望检查不同的ProbeID,因此您可以执行此操作

length(unique(my.data$ProbeID)) == 47234L

但是,如果您需要检查是否存在47,234个ProbeID的某个列表,则必须将该列表放在已加载或已定义的位置以进行检查。请参阅@ csgillespie的回答,因为我认为这就是他要去的地方。

至于性能,如果你可以在Excel中加载它,你可以更快地加载它。