2013-04-05 89 views
3

我有一個文本文件,這種格式之間的值創建清單,開始和結束位置

begin end 
1  10  
25  35 
40  50 
37  48 
...  ... 

我使用這些命令來創建包含所有可在值之間從「開始」和值的列表'end'列

x <- read.table("in.txt") 

result <- vector("list",486) 
     for(i in 1:486){ 
     result[[i]] <- c(x[i,1]:x[i,2]) 
     } 
lapply(result, write, "out.txt", append=TRUE, ncolumns = 1) 

因此,我得到一個文件,其中所有的值都在不同的行上。現在我想要做些額外的事情。

而是隻用「開始」和「結束」欄輸入文件的,我有兩個額外的列,就像這樣:

begin end A B 
1  10  x 0 
25  35  x 1 
40  50  x 2 
37  48  y 0 

我現在想的是,這些其他列的值也出現在我的輸出,所以我得到這樣的東西

position A B 
1   X 0 
2   X 0 
3   X 0 
... 
10   X 0 
... 
40   X 2 
41   X 2 
... 
37   Y 0   

如何更改我的功能,使輸出看起來像這樣?

回答

2

這裏有一個基地答案:

lapply(1:nrow(x), function(u) cbind(position=x$begin[u]:x$end[u], x[u,3:4])) 

HTH

+1

我發現使用'seq(begin,end,by = 1)'更好,因爲它會在'begin> end'時拋出一個錯誤。在某些情況下它可能是可取的。 – Arun 2013-04-05 13:30:02

4

這裏有一個data.table解決方案:

require(data.table) 
DT <- data.table(DF, key=c("A", "B")) 
DT[, list(pos = seq(begin, end, by=1)),by=key(DT)] 
+1

+1哇,我感謝你的偉大的解決方案,但我不會感謝你會因爲頭痛而試圖理解它:) – juba 2013-04-05 13:19:14

相關問題