如何在另一个因素的每个级别聚合一个因素,按分类数据中的其他两个因素分组

How to aggregate a factor at each level of another factor, grouping by two other factors in disaggregated data

假设有跨选举年、选区(或州)和政党的候选人的描述性数据。数据目前在 'sub-district' 级别(例如,投票区)进行分解。

目前,当我尝试将数据汇总到地区级别时,各种方法 return 计数都不准确。换句话说,汇总没有充分考虑到候选人每年在每个地区多次出现在数据中。我需要的是特定政党在特定地区出现的次数的总计数,而不管选区级别的 repeated/duplicated 信息。换句话说,我需要一个结果来显示每个独特的候选人年二元组的地区年二元组的政党计数。 (注意:候选人可能会在 and/or 个选区重复,但可能有不同的党派;Henry Clay 在 1836 年和 1840 年)。

我的问题是:我如何聚合数据以通过对其他两个因素(年份)进行分组来获得另一个因素(地区)的每个级别的一个因素(政党)的计数和候选人姓名 [ID])?

数据结构示例:

year<-rbind("1836", "1836", "1836", "1836", 
            "1840", "1840", "1840", "1840", 
            "1844", "1844", "1844", "1844", 
            "1848", "1848", "1848", "1848")

candidate<-rbind("Henry Clay", "Henry Clay", 
                 "Daniel Webster", 
                 "Daniel Webster", "Henry Clay", 
                 "Henry Clay", "Daniel Webster", 
                 "Daniel Webster", 
                 "Millard Fillmore", 
                 "Millard Fillmore", 
                 "Martin Van Buren", 
                 "Martin Van Buren", 
                 "Millard Fillmore", 
                 "Millard Fillmore", 
                 "Martin Van Buren", 
                 "Martin Van Buren")

party<-rbind("Democratic-Republican", 
             "Democratic-Republican", "Whig", 
             "Whig", "National Republican", 
             "National Republican", "Whig", 
             "Whig", "Know-Nothing", 
             "Know-Nothing", "Democrat", 
             "Democrat", "Know-Nothing", 
             "Know-Nothing", "Democrat", 
             "Democrat")

district<-rbind("Alaska", "Alaska", "Vermont", 
                "Vermont", "Alaska", "Alaska", 
                "Vermont", "Vermont", "Alaska", 
                "Alaska", "Vermont", "Vermont", 
                "Alaska", "Alaska", "Vermont", 
                "Vermont")

precinct<-rbind("Pre1", "Pre2", "Pre1", "Pre2", 
                "Pre1", "Pre2", "Pre1", "Pre2", 
                "Pre1", "Pre2", "Pre1", "Pre2", 
                "Pre1", "Pre2", "Pre1", "Pre2")

sample<-as.data.frame(cbind(year, candidate, party, district, 
              precinct))

不同数据聚合方法的示例:

table

party.counts1<-data.frame(table(sample$V3, sample$V1, sample$V4))

合计:

尝试 2a 接近所需的最终结果,但 returns 计数未指定因素级别(党派)并且仍然是 'over-counting' 基于选区级别外观的党选区数据特定年份的政党候选人。

party.counts2<-aggregate(sample$V3, by=list(sample$V4, sample$V1), FUN=length)

party.counts2a<-aggregate(sample$V3~sample$V1:sample$V4:sample$V2, data=sample, FUN=length)

重塑

Reshape 示例显示与之前的聚合 2a 尝试类似的问题。

library(reshape2)
mdata <- melt(sample, id.vars=c("V1", "V2", "V4", "V5"), measure.vars=c("V3"))

party.counts3<-dcast(mdata, value~V1:V2:V4, length)

同样,我的问题是:如何聚合数据以通过对其他两个因素进行分组来获得另一个因素(地区)的每个级别的一个因素(政党)的计数(年份和候选人姓名 [ID])?

到目前为止,这是一个解决方案,但不是很整洁。例如,构造的计数变量在最终对象中被错误标记为聚合命令中的省略变量(此处为 V2)。此外,结果包含在一个单独的对象 (party.counts) 中,而不是与原始数据(上面标记为样本的对象)合并。

cross.tab<-unique(sample[c("V3", "V4", "V1", "V2")])

party.counts<-aggregate(. ~ V3:V4:V1, cross.tab, length)

对通用性 and/or 向量化以及易于合并到先前(原始)数据结构中的任何帮助或建议表示赞赏。