2016-06-11 111 views
0

,這個問題很相似,這個帖子Splitting a data frame into a list using intervals一個data.frame,但答案並不適用於我的數據,因爲我沒有與二進制值的列。分割使用間隔

我的數據是這樣的:

>df 
    V1  V2  V3   V4 V5  V6  V7  V8 V9 V10 V11 
1 chr1 49828662 49828663 rs7531656 0 +|chr1 48998526 50489626 AGBL4 1 - 
2 chr1 62594676 62594677 rs2481665 0 +|chr1 62208148 62629591 PATJ 1 + 
3 chr1 62633580 62633581 rs2457831 0 +|chr1 62208148 62629591 PATJ 1 + 
4 chr1 66379767 66379768 rs12757124 0 +|chr1 66378927 66840262 PDE4B 1 + 
5 chr1 66392060 66392061 rs55824844 0 +|chr1 66378927 66840262 PDE4B 1 + 
6 chr1 66393984 66393985 rs35185259 0 +|chr1 66378927 66840262 PDE4B 1 + 

我需要的是分裂基於列V2並在5e+05區間的文件,輸出會是這樣的

[[1]] 
1 chr1 49828662 49828663 rs7531656 0 +|chr1 48998526 50489626 AGBL4 1 - 

[[2]] 
2 chr1 62594676 62594677 rs2481665 0 +|chr1 62208148 62629591 PATJ 1 + 
3 chr1 62633580 62633581 rs2457831 0 +|chr1 62208148 62629591 PATJ 1 + 

[[3]] 
4 chr1 66379767 66379768 rs12757124 0 +|chr1 66378927 66840262 PDE4B 1 + 
5 chr1 66392060 66392061 rs55824844 0 +|chr1 66378927 66840262 PDE4B 1 + 
6 chr1 66393984 66393985 rs35185259 0 +|chr1 66378927 66840262 PDE4B 1 + 

我的數據有〜5millions行,所以速度會是一個問題,但後來我可以對付它

+0

'split'上'cut' – alistaire

回答

1

也許你正在尋找這個代替:

split(df, cumsum(c(F, diff(df$V2) > 5e5))) 

$`0` 
    V1  V2  V3  V4 V5  V6  V7  V8 V9 V10 V11 
1 chr1 49828662 49828663 rs7531656 0 +|chr1 48998526 50489626 AGBL4 1 - 

$`1` 
    V1  V2  V3  V4 V5  V6  V7  V8 V9 V10 V11 
2 chr1 62594676 62594677 rs2481665 0 +|chr1 62208148 62629591 PATJ 1 + 
3 chr1 62633580 62633581 rs2457831 0 +|chr1 62208148 62629591 PATJ 1 + 

$`2` 
    V1  V2  V3   V4 V5  V6  V7  V8 V9 V10 V11 
4 chr1 66379767 66379768 rs12757124 0 +|chr1 66378927 66840262 PDE4B 1 + 
5 chr1 66392060 66392061 rs55824844 0 +|chr1 66378927 66840262 PDE4B 1 + 
6 chr1 66393984 66393985 rs35185259 0 +|chr1 66378927 66840262 PDE4B 1 + 
+0

我得到一些錯誤@Psidom與另一個data.table,你能幫助我嗎? – user2380782

+0

你需要更具體的瞭解,你有問題或交的另一個問題,如果評論是不夠的,你來形容。我或其他人會很樂意提供幫助。 – Psidom

+0

無後顧之憂@Psidom,問題是當差是負的,但我知道有'分裂(DF,cumsum(C(F,ABS(DIFF(DF $ V2))> 5E5)))'問題就解決了 – user2380782

3

首先讓你的分割點:

splits <- seq(0,5e6, 5e5)

下面是一些僞數據,可能是你的V2柱:

f <- cut(v2, splits) 
> table(f) 
f (0,5e+05] (5e+05,1e+06] (1e+06,1.5e+06] (1.5e+06,2e+06] (2e+06,2.5e+06] (2.5e+06,3e+06] (3e+06,3.5e+06] (3.5e+06,4e+06] (4e+06,4.5e+06] (4.5e+06,5e+06] 

    499497  500111   499327   501262   499155   500263   500484   499776   500899   499226 

v2 <- runif(5e6, 0, 5e6)

現在稱之爲削減此列使用分割點來創建一個因素

最後呼籲您data.frame分裂並通過因素:

df.list <- split(mydf, f)

1

我沒有得到的輸出作爲@ Zelazny7相同。這是我的方法data.table叫做mydat

library(data.table) 

breaks = 5e+05*(floor(min(mydat$V2)/5e+05):ceiling(max(mydat$V2)/5e+05)) 
mydat$X<-mydat[,.(X = cut(V2, breaks = breaks))] 
mylist<-split(mydat, mydat$X) 
+0

我有一個錯字在我的'seq'功能 – Zelazny7

+0

是的,我想通這一點。一旦我修好它,它運行良好。 –