将数据 reshape 为交叉表

标签 r

我需要转换这个数据集:

   user year type
1     1 2012    A
2     2 2012    C
3     3 2012    C
4     4 2012    B
5     5 2012    C
6     6 2012    A
7     7 2012    A
8     8 2012    A
9     9 2012    C
10   10 2012    C
11    1 2013    B
12    2 2013    C
13    3 2013    C
14    4 2013    C
15    5 2013    C
16    6 2013    A
17    7 2013    C
18    8 2013    A
19    9 2013    B
20   10 2013    C

带输出

DF <-structure(list(user = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"), class = "factor"), 
year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("2012", 
"2013"), class = "factor"), type = structure(c(1L, 3L, 3L, 
2L, 3L, 1L, 1L, 1L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 1L, 3L, 1L, 
2L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("user", 
"year", "type"), row.names = c(NA, -20L), class = "data.frame")

我想用这种方式进行交叉制表

    A(2012) B(2012) C(2012)
A(2013) a   b   c
B(2013) d   e   f
C(2013) g   h   i

其中a、b、c、d、e、f、g、h是频率(h:2013年C类用户数量和2012年B类用户数量)

我尝试过 dcast、melt、xtabs,但没有实现。

有什么想法吗?

谢谢

编辑:解决方案需要使用无序数据框,并且缺少行...

最佳答案

另一个类似的想法:

do.call(table, split(DF$type, DF$year))
#    2013
#2012 A B C
#   A 2 1 1
#   B 0 0 1
#   C 0 1 4

看起来 table 可以方便地处理“列表”参数,因此 table(split(DF$type, DF$year)) 也可以工作。

关于将数据 reshape 为交叉表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26102539/

相关文章:

r - 从 R 中的数据框/矩阵中选择一列时保留列名称

database - 按日期绘制 Twitter 搜索结果的词云? (使用 R)

perl - 创建并执行一个 R 脚本,就像 perl -e 以在 bash 等 shell 中编写 R 脚本?

r - R 中每个物种的平均个体数/公顷

r - 函数 `dist` 在缺失值的向量上表现不正常

R - 不同列的 fiddle 图

r - 将新数据点分配给内核 k-means 中的簇(R 中的 kernlab 包)?

r - R中的Sankey图

r - 将多个列合并为一个具有 R 中特定条件的列

r - 使用Docker安装rpy2找不到R路径