2012-10-30 63 views
1

我想要分割的数据帧这样分割一个数据帧划分成使用间隔

chr.pos nt.pos CNV 
1 74355 0 
1 431565 0 
1 675207 0 
1 783605 1 
1 888149 1 
1 991311 1 
1 1089305 1 
1 1177669 1 
1 1279886 0 
1 1406311 0 
1 1491385 0 
1 1579761 0 
2 1670488 1 
2 1758800 1 
2 1834256 0 
2 1902924 1 
2 1978088 1 
2 2063124 0 

的点的列表是获得其中字符是相同的并且CNV = 1列间隔的列表,但考虑到它们之间的0 inerval

[[1]] 

    1 783605 1 
    1 888149 1 
    1 991311 1 
    1 1089305 1 
    1 1177669 1 
[[2]] 
    2 1670488 1 
    2 1758800 1 
[[3]] 
    2 1902924 1 
    2 1978088 1 

任何想法?

回答

5

您可以使用rle创建一个变量在split

# create a group identifier 
    DF$GRP <- with(rle(DF$CNV), rep(seq_along(lengths),lengths)) 


    # split a subset of DF which contains only CNV==1 
    split(DF[DF$CNV==1,],DF[DF$CNV==1,'GRP']) 


$`2` 
    chr.pos nt.pos CNV GRP 
4  1 783605 1 2 
5  1 888149 1 2 
6  1 991311 1 2 
7  1 1089305 1 2 
8  1 1177669 1 2 

$`4` 
    chr.pos nt.pos CNV GRP 
13  2 1670488 1 4 
14  2 1758800 1 4 

$`6` 
    chr.pos nt.pos CNV GRP 
16  2 1902924 1 6 
17  2 1978088 1 6 
+0

非常感谢使用!我不知道rle和seq_along,谢谢分享! – user976991