我有一个数据框,其中包含有关政治候选人(在数据中用#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这样做的方法,但我不确定。有人有任何提示吗?
答案 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)
以下是使用tidyr
,dplyr
和table()
的可能解决方案。首先,我们计算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