使用间隔拆分data.frame

时间:2016-06-11 00:46:06

标签: r dataframe

此问题与此帖Splitting a data frame into a list using intervals非常相似,但答案并不适用于我的数据,因为我没有包含二进制值的列。

我的数据如下:

>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   +

我的数据有大约500万行,所以速度会有问题,但我可以稍后处理

3 个答案:

答案 0 :(得分:3)

首先制作分裂点:

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

这里有一些可能在你的V2列中的虚拟数据:

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

现在在此列上调用cut来使用分割点创建一个因子:

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

最后在data.frame上调用split并传递因子:

df.list <- split(mydf, f)

答案 1 :(得分: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)

答案 2 :(得分: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   +