【发布时间】:2016-11-26 21:40:07
【问题描述】:
我有一个数据框,其中包含有关对政治候选人(在数据中以“cand”表示)和政治组织(在数据中以“comm”表示)的财务捐款信息。数据框还包括每个贡献者的唯一 ID,数据中的每一行表示所做的一个贡献。我想要做的是获得一个交叉表,显示对于每个政治(非候选人)组织,这些组织有多少捐助者也为数据框中的每个政治候选人做出了贡献。数据框如下所示:
contributor ID . organization
1 cand1
2 cand2
3 comm1
3 cand1
4 cand1
5 cand2
5 cand1
5 comm2
我希望能够创建的是这样的:
Comm . Cand
Cand1 . Cand2
Comm1 1 0
Comm2 1 1
(因为 1 个人 -- ID #3 -- 对 comm1 和 cand1 都做出了贡献,而 1 个人 -- ID #5 -- 对 comm1、cand1 和 cand2 做出了贡献。)
我已经考虑过使用聚合或 dplyr 执行此操作的方法,但我不确定。有人有什么建议吗?
【问题讨论】:
-
如果内存可用,您可以从
crossprod(table(dat))开始 - 如here- 和相应的子集,如crossprod(table(dat))[startsWith(levels(dat$org), "comm"), startsWith(levels(dat$org), "cand")] -
谢谢。这段代码出现以下错误: 表(表)中的错误:尝试使用 >= 2^31 个元素创建表。你有什么建议吗?
-
按照同样的思路,您可以尝试使用稀疏替代方案 --
library(Matrix); tab = xtabs( ~ contributorID + organization, dat, sparse = TRUE); crossprod(tab[, startsWith(colnames(tab), "comm")], tab[, startsWith(colnames(tab), "cand")]) -
问题解决了吗?如果是,您能接受其中一个答案吗?