我有以下类型的数据:
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
我需要自动化流程,因为真正的数据非常大。请建议我们怎么做?
答案 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,因此您的一些示例中断与代码略有不同,但似乎具有可比性。