在R中创建特定的交叉表?

时间:2016-11-26 21:40:07

标签: r crosstab summary

我有一个数据框,其中包含有关政治候选人(在数据中用#34; cand"表示)和政治组织(在数据中用#34; comm&#34表示)的财务贡献的信息。数据框还包括每个贡献者的唯一ID,数据中的每一行表示一个贡献。我想做的是获得一个交叉表,显示每个政治(非候选)组织,这些组织的捐助者也为数据框中的每个政治候选人做出了贡献。数据框如下所示:

  Comm .              Cand
               Cand1 .     Cand2
  Comm1        1           0
  Comm2        1           1

我想要创建的是这样的:

{{1}}

(因为1个人 - 身份#3 - 对comm1和cand1都有贡献,1个人 - 身份#5 - 对comm1,cand1和cand2有贡献。)

我已经考虑过使用aggregate或dplyr这样做的方法,但我不确定。有人有任何提示吗?

3 个答案:

答案 0 :(得分:0)

你需要使用像tidyr这样的东西。你需要为每个委员会制定一个变量,为每个候选人制作一个变量。您的数据已经是长格式,但您现在需要做的是使用组织创建一个宽数据框,并将捐赠者ID作为唯一ID。你可以做交叉表。

答案 1 :(得分:0)

...
bMap = generateMap()
lon,lat = bMap(lon,lat)
t = threading.Thread(target=plot(cur_hour, leg, OUTDIR, bMap, lon, lat))
t.start()
...
t.join()
...

更新。尽量避免使用dfs = read.table(text = "contributor organization 1 cand1 2 cand2 3 comm1 3 cand1 4 cand1 5 cand2 5 cand1 5 comm2", sep = " ", stringsAsFactors = FALSE, header = TRUE) # select only comms with their contributor comms = dfs[grep("^comm", dfs$organization), ] colnames(comms)[2] = "comms" # select only cands cands = dfs[grep("^cand", dfs$organization), ] colnames(cands)[2] = "cands" # combine comms and candidates new_dfs = merge(comms, cands, all = TRUE) with(new_dfs, table(comms, cands))

创建大型矩阵
table

答案 2 :(得分:0)

以下是使用tidyrdplyrtable()的可能解决方案。首先,我们计算cand a com的贡献者数量摘要。

library(tidyr)
library(dplyr)

df_summary <- 
df %>% mutate(ct = 1) %>% spread(organization, ct) %>% 
transmute(
  comm1_cand1 = ifelse(cand1 + comm1 > 0, 1, 0),
  comm2_cand1 = ifelse(cand1 + comm2 > 0, 1, 0),
  comm1_cand2 = ifelse(cand2 + comm1 > 0, 1, 0),
  comm2_cand2 = ifelse(cand2 + comm2 > 0, 1, 0)) %>%
gather() %>%
separate(key, into = c("comm", "cand"), sep = "_")

这给出了一个双向分类数据框,如下所示:

#    comm  cand value
#1  comm1 cand1    NA
#2  comm1 cand1    NA
#3  comm1 cand1     1
#4  comm1 cand1    NA
#5  comm1 cand1    NA
#6  comm2 cand1    NA
#7  comm2 cand1    NA
# etc

现在我们从数据中制作双向表。

table(df_summary)

#   cand
#comm    cand1 cand2
#  comm1     1     0
#  comm2     1     1