根据r中列的累积值拆分数据

时间:2014-06-27 15:47:39

标签: r split dataframe

我有以下类型的数据:

    myd <- data.frame (group  = c(rep(1, 15), rep(2, 15)),
                       distance = c(0, 4, 8,9,11,  14,18,19,23, 24,  29,30,35,40, 43,
                                    0, 8,9,9,12,   13,14,15,16, 18,  23,24,28, 29, 30),
                      var1 = c(1:15, 11:25), var2 = 1:30, var3 = 1:30)
    myd 

   group distance var1 var2 var3
1      1        0    1    1    1
2      1        4    2    2    2
3      1        8    3    3    3
4      1        9    4    4    4
5      1       11    5    5    5
6      1       14    6    6    6
7      1       18    7    7    7
8      1       19    8    8    8
9      1       23    9    9    9
10     1       24   10   10   10
11     1       29   11   11   11
12     1       30   12   12   12
13     1       35   13   13   13
14     1       40   14   14   14
15     1       43   15   15   15
16     2        0   11   16   16
17     2        8   12   17   17
18     2        9   13   18   18
19     2        9   14   19   19
20     2       12   15   20   20
21     2       13   16   21   21
22     2       14   17   22   22
23     2       15   18   23   23
24     2       16   19   24   24
25     2       18   20   25   25
26     2       23   21   26   26
27     2       24   22   27   27
28     2       28   23   28   28
29     2       29   24   29   29
30     2       30   25   30   30

我有多个组级别(上面显示的是2个)。对于每个距离(比如高速公路中的英里帖子)从0开始并累积到该组结束。我希望以这样的方式拆分数据(生成箱),使得每个组大约距离为10.生成的拆分数据将类似于:

data group1subset1

          group distance var1 var2 var3
    1      1        0    1    1    1
    2      1        4    2    2    2
    3      1        8    3    3    3
    4      1        9    4    4    4
data group1subset2
    5      1       11    5    5    5
    6      1       14    6    6    6
    7      1       18    7    7    7
    8      1       19    8    8    8
data group1subset3
    9      1       23    9    9    9
    10     1       24   10   10   10
    11     1       29   11   11   11
    12     1       30   12   12   12
data group1subset4
    13     1       35   13   13   13
    14     1       40   14   14   14
data group1subset5
    15     1       43   15   15   15
=====
data group2subset1
    16     2        0   11   16   16
    17     2        8   12   17   17
    18     2        9   13   18   18
    19     2        9   14   19   19
data group2subset2
    20     2       12   15   20   20
    21     2       13   16   21   21
    22     2       14   17   22   22
    23     2       15   18   23   23
    24     2       16   19   24   24
    25     2       18   20   25   25
data group2subset3
    26     2       23   21   26   26
    27     2       24   22   27   27
    28     2       28   23   28   28
    29     2       29   24   29   29
    30     2       30   25   30   30

我需要自动化流程,因为真正的数据非常大。请建议我们怎么做?

2 个答案:

答案 0 :(得分:6)

我实际上使用cut来完成此任务:

maxd <- (max(myd$distance) %/% 10 * 10) + 10


transform(myd,cutdist = cut(distance, breaks = seq(0,maxd, by = 10),
                            include.lowest = TRUE))

   group distance var1 var2 var3 cumdist cutdist
1      1        0    1    1    1       0  [0,10]
2      1        4    2    2    2       4  [0,10]
3      1        8    3    3    3      12  [0,10]
4      1        9    4    4    4      21  [0,10]
5      1       11    5    5    5      32 (10,20]
6      1       14    6    6    6      46 (10,20]
7      1       18    7    7    7      64 (10,20]
8      1       19    8    8    8      83 (10,20]
9      1       23    9    9    9     106 (20,30]
10     1       24   10   10   10     130 (20,30]
11     1       29   11   11   11     159 (20,30]
12     1       30   12   12   12     189 (20,30]
13     1       35   13   13   13     224 (30,40]
14     1       40   14   14   14     264 (30,40]
15     1       43   15   15   15     307 (40,50]
16     2        0   11   16   16     307  [0,10]
17     2        8   12   17   17     315  [0,10]
18     2        9   13   18   18     324  [0,10]
19     2        9   14   19   19     333  [0,10]
20     2       12   15   20   20     345 (10,20]
21     2       13   16   21   21     358 (10,20]
22     2       14   17   22   22     372 (10,20]
23     2       15   18   23   23     387 (10,20]
24     2       16   19   24   24     403 (10,20]
25     2       18   20   25   25     421 (10,20]
26     2       23   21   26   26     444 (20,30]
27     2       24   22   27   27     468 (20,30]
28     2       28   23   28   28     496 (20,30]
29     2       29   24   29   29     525 (20,30]
30     2       30   25   30   30     555 (20,30]

实际上没有必要计算累积距离,因为你想将它们保持在10的倍数组中

答案 1 :(得分:3)

怎么样?
split(myd, interaction(myd$distance %/%10, myd$group, drop=F), drop=T)

这里我们根据它可被10整除的次数来区分距离,并创建与群组的互动以为每个群体制作不同的类别。我们认为这是split()的一个因素。这将第一组设置为0,第二组设置为10,因此您的一些示例中断与代码略有不同,但似乎具有可比性。