合并R中的数据表

时间:2015-01-13 04:34:38

标签: r merge cumsum

我为这个简单的问题道歉。基本上,我想制作三个单独的cumsum()表,并通过第一个表将它们合并在一起。例如:

a <- cumsum(table(df$variable))
b <- cumsum(table(df$variable[c(TRUE, FALSE)]))
c <- cumsum(table(df$variable[c(FALSE, TRUE)]))

其中 a 是df $变量的整个向量的cumsum, b 是df $ variable的奇数值的cumsum, c 是df $ variable的偶数值的cumsum。解释这一点的另一种方法是,结合 b c 会产生 a

这是整个数字向量。

  [1] 18 17 15 10  5  0 10 10  0 10 15  5  5  5 25 15 13  0  0  0 25 18 15 15  1  4  5
 [28]  5  5 15  5 12 15  0  3 12 20  0  5  5 13 10 10 10  3 15 13 20 12 60 10 10  2  0
 [55]  5 10  8  4  0 15  5  5 15  5  0  5  2  8  5  5  5  5  9  9  3  7 20 25  5  4 10
 [82] 10  2  4  5  5 18  8  0 10  5  5  7 12  5 13 26 20 13 21  5 15 10 10  5 15  5 15
[109]  0  1 13 21 25 25  5 14  5 15 10  0  5 15  3  4  5 15 15  5 25 25  5 15  0  2 13
[136] 22  2 10  3  3 15 11  0  2 40 35 24 24  5  5 10  5 16  0 17 19 20  5  5  5  0 15
[163]  3 13 20  4  5  5  3 19 25 25  0 15  5  3 22 22 25  5 15 15  5 15 17  9  5  5 15
[190] 10

对于a,我使用了cbind(cumsum(table(df $ variable)))

0     18
1     20
2     26
3     35
4     41
5     88
7     90
8     93
9     96
10   115
11   116
12   120
13   128
14   129
15   154
16   155
17   158
18   161
19   163
20   169
21   171
22   174
24   176
25   186
26   187
35   188
40   189
60   190

对于b,我使用了cbind(cumsum(table(df $ variable [c(TRUE,FALSE)])))

0    10
1    11
2    15
3    22
5    50
7    51
8    52
9    53
10   60
12   61
13   67
15   76
16   77
17   79
18   81
20   85
22   86
24   87
25   93
26   94
40   95

对于c,我使用了cbind(cumsum(table(df $ variable [c(FALSE,TRUE)])))

0     8
1     9
2    11
3    13
4    19
5    38
7    39
8    41
9    43
10   55
11   56
12   59
13   61
14   62
15   78
17   79
18   80
19   82
20   84
21   86
22   88
24   89
25   93
35   94
60   95

在频率形式中,分布看起来应该是这样的。

    a   b   c
0   18  10  8
1   2   1   1
2   6   4   2
3   9   7   2
4   6   0   6
5   47  28  19
7   2   1   1
8   3   1   2
9   3   1   2
10  19  7   12
11  1   0   1
12  4   1   3
13  8   6   2
14  1   0   1
15  25  9   16
16  1   1   0
17  3   2   1
18  3   2   1
19  2   0   2
20  6   4   2
21  2   0   2
22  3   1   2
24  2   1   1
25  10  6   4
26  1   1   0
35  1   0   1
40  1   1   0
60  1   0   1
    190 95  95

但是我想用cumsum()形式,这样看起来应该是这样的。我把前6行写成了插图。

    a   b   c
0   18  10  8
1   20  11  9
2   26  15  11
3   35  22  13
4   41  22  19
5   88  50  38
7   90  51  39

我遇到的问题是子集 a b 没有所有值(即某些值有0个频率),这样它缩短向量的长度;因此,我无法正确合并或cbind()这些值。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

你可以很容易地使用match到达那里。假设您的数据是:

set.seed(1)
df <- data.frame(variable=rbinom(10,prob=0.5,size=3))

这样的事情似乎有效

out <- data.frame(a,b=b[match(names(a),names(b))],c=c[match(names(a),names(c))])
replace(out,is.na(out),0)

#   a b c
#0  1 0 1
#1  4 2 2
#2  7 4 3
#3 10 5 5