首页 > 解决方案 > 基于两列中的值的交叉制表

问题描述

我有一个交叉表问题。我的数据有 9600 行,这是一个简化的示例,其中我删除了几个参数:

Year   Sex    Area
1938    F      2
1938    M      2
1939    M      2
1939    M      5
1955    F      4
1957    F      4
1955    M      4
1943    M      6
1988    F      1
1988    M      2
1987    M      2
1955    M      3
1984    M      4
1984    F      5
1966    M      6
1955    F      8
1984    F      9
1955    M      3
1981    M      6
1938    F      6

我正在寻找一个像这样对我的数据进行交叉制表的表格,并且我需要案例 Area~Year 的统计,而不是参数值的总和。

Year   Area=1  Area=2  Area=3  Area=3  Area=5  Area=6  Area=7  Area=8  Area=9
1938     7       0       1       9       2       8       1      14       4 
1939     4       4      12      66       3      42      87      24      54 
1940     9      33       1       1       6      22       1       5      15 
1941     12      2       8      77      11      23       4      14       6 
...

我知道有几种方法可以做到这一点,它们可能很简单,但我找不到正确的程序。

标签: rcrosstab

解决方案


使用 dcast 功能

library(reshape2)
dcast(df, Year~Area, value.var = "Area", fun.aggregate = length)

结果:

   Year 1 2 3 4 5 6 8 9
1  1938 0 2 0 0 0 1 0 0
2  1939 0 1 0 0 1 0 0 0
3  1943 0 0 0 0 0 1 0 0
4  1955 0 0 2 2 0 0 1 0
5  1957 0 0 0 1 0 0 0 0
6  1966 0 0 0 0 0 1 0 0
7  1981 0 0 0 0 0 1 0 0
8  1984 0 0 0 1 1 0 0 1
9  1987 0 1 0 0 0 0 0 0
10 1988 1 1 0 0 0 0 0 0

您可以进一步重命名列。

ct <- dcast(df, Year~Area, value.var = "Area", fun.aggregate = length)
colnames(ct) <- c(colnames(ct[1]), paste0("Area=", colnames(ct[-1])))
ct

结果:

   Year Area=1 Area=2 Area=3 Area=4 Area=5 Area=6 Area=8 Area=9
1  1938      0      2      0      0      0      1      0      0
2  1939      0      1      0      0      1      0      0      0
3  1943      0      0      0      0      0      1      0      0
4  1955      0      0      2      2      0      0      1      0
5  1957      0      0      0      1      0      0      0      0
6  1966      0      0      0      0      0      1      0      0
7  1981      0      0      0      0      0      1      0      0
8  1984      0      0      0      1      1      0      0      1
9  1987      0      1      0      0      0      0      0      0
10 1988      1      1      0      0      0      0      0      0

推荐阅读