2011-03-08 83 views
3

我與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工具結合起來執行這個操作會很好。

+1

的似乎不是你的示例輸出是真的嗎? – 2011-03-08 18:48:37

+0

@Jouni:這是,但你在文件中有不同的標題... – 2011-03-08 19:19:31

回答

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」找到的位置「開始=」,增加了6(長度「開始=」 ),從這個位置開始的子字符串,並截斷它爲一個整數值,並將其分配給i(在awk整數和字符串可以互換,「12345 step = 1」作爲一個整數值爲12345的罰款,但我們想要以後只打印整數部分,所以在這裏截取它是有意義的)。對於「step =」也是如此。

在不以「f」開頭的行上,它打印i和行,並將d添加到i

+1

非常好!我嚴重懷疑有一個R簡潔的答案... – 2011-03-08 19:01:35

+0

感謝您的UNIX代碼。我把它作爲一個* .sh腳本封裝起來,它運行得非常漂亮。我用1.52億行測試了一個文件的腳本,似乎需要一段時間才能運行。由於我是unix的新手,我無法解析你的代碼。我瞭解awk的第一部分,您正在尋找以'fixedStep'開頭的行。你能初步解釋它是如何工作的嗎?還有一種方法來檢查輸出是否正確?再次感謝... – user645600 2011-03-08 22:51:41

+0

我添加了一個解釋。如果速度太慢,請注意,有幾個[awk實現](http://en.wikipedia.org/wiki/AWK#Versions_and_implementations)可能會有速度差異。我會嘗試至少[mawk](http://invisible-island.net/mawk/),聲稱它速度很快(儘管我自己沒有做任何測量)。 – 2011-03-09 02:47:52

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) 
} 

測試您的數據:「以1爲增量」屬性

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