根据列标题添加新列

时间:2011-03-08 18:04:26

标签: unix r

我正在与R合作,在一个列中转换数百万行数据,就像这样......

fixedStep chrom=chr7 start=10239 step=1
0.064
0.064
0.064
0.055
0.055
0.089
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.076
0.089
0.076
0.076
0.076
0.076
0.089
0.089
0.076
0.089
0.076
0.089
0.089
fixedStep chrom=chr7 start=10398 step=1
0.076
0.089
0.089
0.089
0.089
0.076
对此......

10239 0.064
10240 0.064
10241 0.064
10242 0.055
10243 0.055
10244 0.089
10245 0.076
10262 0.076
10263 0.076
10264 0.089
10265 0.076
10266 0.076
10267 0.076
10268 0.076
10269 0.089
10270 0.089
10271 0.076
10272 0.089
10273 0.076
10274 0.089
10275 0.089
10398 0.076
10399 0.089
10400 0.089
10401 0.089
10402 0.089
10403 0.076

即,我想添加一个新的数字列(在数据之前或之后,在上面的例子中,它在数据之前)。新列的编号从start=value开始,并递增1(step=1),直到达到新的列标题(fixedStep chrom=chr7 start=10262 step=1)。发生这种情况时,数字从start=new value开始,再次增加1(step=1),直到新的列标题......依此类推。

由于它是一个大文件,我无法将其加载到R工作区。将它与UNIX / linux工具结合起来执行此操作会很好。

2 个答案:

答案 0 :(得分:4)

既然你说过unix ......

#!/usr/bin/awk -f
/^fixedStep/ {
  i=int(substr($0,match($0,"start=")+6))
  d=int(substr($0,match($0,"step=")+5))
}
!/^f/ { print i, $0; i+=d }

它做什么:在以“fixedStep”开头的行上找到“start =”的位置,加上6(“start =”的长度),从该位置开始的子串并将其截断为整数value并将其分配给i(在awk中整数和字符串是可以互换的,“12345 step = 1”可以作为值为12345的整数正常工作,但是我们想稍后只打印整数部分,这样才有意义在这里截断它)。类似地,对于“step =”。

在不以“f”开头的行上,它会打印i和该行,并将d添加到i

答案 1 :(得分:2)

您可以使用函数readLines逐个扫描文件。这样您就不必将所有内容加载到内存中。一种可能性是使用以下功能。

不简洁,不快(当你逐行阅读时),但是它为你提供了数据帧而无需读取整个文件。如果您只想生成一个新文件,请务必使用除R之外的其他内容。这里给出的awk解决方案似乎是最好的解决方案。

ReadFile <- function(file){

  DF <- data.frame(ID=numeric(0),value=numeric(0))

   while(1){

    z <- readLines(file,1)
    if(length(z)==0 | z=="") {break}

    Start <- if(grepl("start",z))
      as.numeric(gsub(".+start=(\\d+).+","\\1",z))

    if(is.null(Start)){
        DF <- rbind(DF,
            data.frame(ID=ID,value=as.numeric(z))
        )
        ID <- ID + 1
    } else {
      ID <- Start
    }
  }
  return(DF)
}

根据您的数据进行测试:

ZZ <- textConnection("fixedStep chrom=chr7 start=10239 step=1
0.064
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.089
fixedStep chrom=chr7 start=10398 step=1
0.045
0.089
")

> ReadFile(ZZ)
     ID value
1 10239 0.064
2 10240 0.076
3 10262 0.076
4 10263 0.089
5 10398 0.045
6 10399 0.089