如何通过对数据进行分组来制作枢轴 table
How to make a pivot table by grouping the data
这是我的数据:
ID Day advance nb_event
ID1 1 NA 899
ID1 1 NA 899
ID1 1 NA 899
ID1 2 0.14 899
ID1 2 NA 899
ID1 3 0.22 899
ID1 3 NA 899
ID1 3 NA 899
ID1 2 NA 899
ID1 4 -0.96 899
ID1 4 NA 899
...
ID1 30 0.74 899
ID1 30 NA 899
ID1 30 NA 899
ID1 30 NA 899
ID2 1 NA 127
ID2 1 NA 127
ID2 2 1.54 127
...
ID2 16 0.74 127
ID3 1 NA 631
ID3 2 -0.48 631
...
ID3 35 0.25 631
...
ID80459
变量说明:
advence
:每日进步;
nb_event:
每个事件的编号 ID
。
我想通过以下命令对 advance
和 nb_event
进行分组:
cut.advance <- cut(advance, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)
cut.nb <- cut(nb_event, breaks = c(1, 500, 1000, 5000, 15000, 20000, 50000, Inf), right = FALSE)
然后,如何做一个枢轴table,根据nb_event
组统计每个advance
组的事件?
预期结果(在table中是相对事件天数):
cut.nb
cut.advance |1-500 501-1000 1001-5000 5k-15k 15k-20k 20k-50k more 50k
|
More -50% |
-50 to -25% |
-25 to -10% |
-10 to 0% |
Unchange |
0 to 2% |
2% to 5% |
5% to 15% |
15% to 30% |
30% to 50% |
50% to 100% |
More 100% |
rws <- levels(cut.advance)
cols <- levels(cut.nb)
new_table <- matrix(0,length(rws),length(cols))
new_table[cbind(match(cut.advance, rws), match(cut.nb, cols))] <- 1
dimnames(new_table) <- list(rws, cols)
new_table
levels
参数允许我们列出所有可能的削减。我们将 advance
削减分配给 rws
以提醒我们将它们用作我们的行,cols
用于 nb_event
。
我们用零创建一个新矩阵。
有趣的部分是使用 cbind
和 match
将 1 分配给所有行列组合。您应该 运行 这些函数逐个查看发生了什么(即 match(cut.advance, rws)
)。
这是我的数据:
ID Day advance nb_event
ID1 1 NA 899
ID1 1 NA 899
ID1 1 NA 899
ID1 2 0.14 899
ID1 2 NA 899
ID1 3 0.22 899
ID1 3 NA 899
ID1 3 NA 899
ID1 2 NA 899
ID1 4 -0.96 899
ID1 4 NA 899
...
ID1 30 0.74 899
ID1 30 NA 899
ID1 30 NA 899
ID1 30 NA 899
ID2 1 NA 127
ID2 1 NA 127
ID2 2 1.54 127
...
ID2 16 0.74 127
ID3 1 NA 631
ID3 2 -0.48 631
...
ID3 35 0.25 631
...
ID80459
变量说明:
advence
:每日进步;
nb_event:
每个事件的编号 ID
。
我想通过以下命令对 advance
和 nb_event
进行分组:
cut.advance <- cut(advance, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)
cut.nb <- cut(nb_event, breaks = c(1, 500, 1000, 5000, 15000, 20000, 50000, Inf), right = FALSE)
然后,如何做一个枢轴table,根据nb_event
组统计每个advance
组的事件?
预期结果(在table中是相对事件天数):
cut.nb
cut.advance |1-500 501-1000 1001-5000 5k-15k 15k-20k 20k-50k more 50k
|
More -50% |
-50 to -25% |
-25 to -10% |
-10 to 0% |
Unchange |
0 to 2% |
2% to 5% |
5% to 15% |
15% to 30% |
30% to 50% |
50% to 100% |
More 100% |
rws <- levels(cut.advance)
cols <- levels(cut.nb)
new_table <- matrix(0,length(rws),length(cols))
new_table[cbind(match(cut.advance, rws), match(cut.nb, cols))] <- 1
dimnames(new_table) <- list(rws, cols)
new_table
levels
参数允许我们列出所有可能的削减。我们将 advance
削减分配给 rws
以提醒我们将它们用作我们的行,cols
用于 nb_event
。
我们用零创建一个新矩阵。
有趣的部分是使用 cbind
和 match
将 1 分配给所有行列组合。您应该 运行 这些函数逐个查看发生了什么(即 match(cut.advance, rws)
)。