r - 基于两列中的值的交叉制表
问题描述
我有一个交叉表问题。我的数据有 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
...
我知道有几种方法可以做到这一点,它们可能很简单,但我找不到正确的程序。
解决方案
使用 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
推荐阅读
- python - 带有布尔字段的Django If语句不起作用
- java - 黄瓜爪哇。我在尝试构建布尔方法时遇到问题
- java - 使用 Eclipse 而不是 Android Studio
- python - 对字符串进行排序并返回
- promise - RxJs throwError 不会在 Promise 中触发 catch
- javascript - 将缓冲区数据转换为图像
- c++ - QPlainTextEdit 中的多个可视文本光标
- java - FragmentStateAdapter onRefreshListener
- python - 初始化集合理解
- graphql - 我收到以下错误:[GraphQL 错误]:消息:任务