【问题标题】:Melt and dcast an awkward dataframe融化并 dcast 一个尴尬的数据帧
【发布时间】:2015-03-23 19:02:29
【问题描述】:

我正在使用如下所示的数据框。我想看起来像:

省:区:A党得票:A党百分比:B党得票:B党百分比:C党得票:C党百分比

现在候选名称作为唯一标识符运行良好,以避免需要聚合函数,但我最终会放弃它。

candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
party<-rep(c('A', 'B', 'C'), 4)
district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
votes<-round(rnorm(12, mean=5000, sd=1000),0)
percent<-round(rnorm(12, mean=37, sd=10),2)
df<-data.frame(party, district,province, votes, percent, candidate)

我正在使用这些命令

df.test<-melt(df, id.vars=c('candidate', 'province', 'district', 'party'))
dcast(df.test, candidate+province+district~variable+party, value.var=c('value'))

很接近,不是每个区创建一行,而是每个区创建四行。问题是:在我的示例数据集中,当我从我的选角电话中删除“候选人”时,这个示例数据集效果很好,例如

dcast(df.test, district~variable+party, value.var=c('value'))

但是当我在我的数据集中使用相同的调用时,我不再拥有唯一标识符,并且它会按长度聚合。

希望您能提供帮助。谢谢。

【问题讨论】:

    标签: r reshape2


    【解决方案1】:

    data.table v1.9.5 中,dcast 可以转换为多个value.var 列。你可以这样做:

    require(data.table) #v1.9.5+
    ans = dcast(setDT(df), province + district ~ party, value.var = c("votes", "percent"))
    #      province    district votes_A votes_B votes_C percent_A percent_B percent_C
    # 1: Province 1  District 1    3072    3149    4262     34.29     18.45     19.20
    # 2: Province 2  District 2    5918    3970    4201     36.56     46.22     43.16
    # 3: Province 3  District 3    5593    5208    5260     26.58     31.20     39.00
    # 4: Province 4 Disctrict 4    6138    4537    6293     43.97     43.62     32.48
    

    如果你想要一个data.frame 回来,那么你可以通过setDF(ans)ans 转换为data.frame

    您可以通过关注these instructions来安装v1.9.5

    【讨论】:

      【解决方案2】:

      这是一个基本解决方案:

      set.seed(1)
      candidate<-c('bob jones', 'bobby jones', 'sara jones', 'sara norah', 'nora jones', 'other name', 'name other', 'thomas name', 'name judge', 'my mayor', 'peter peter', 'paul paul')
      party<-rep(c('A', 'B', 'C'), 4)
      district<-c(rep('District 1', 3), rep('District 2', 3), rep('District 3', 3), rep('Disctrict 4', 3))
      province<-c(rep('Province 1', 3), rep('Province 2', 3), rep('Province 3', 3), rep('Province 4', 3))
      votes<-round(rnorm(12, mean=5000, sd=1000),0)
      percent<-round(rnorm(12, mean=37, sd=10),2)
      df<-data.frame(party, district,province, votes, percent, candidate)
      
      
      reshape(df, direction = 'wide', times = c('votes','percent'),
              idvar = c('province', 'district'), 
              timevar = 'party', drop = 'candidate')
      
      #       district   province votes.A percent.A votes.B percent.B votes.C percent.C
      # 1   District 1 Province 1    4374     30.79    5184     14.85    4164     48.25
      # 4   District 2 Province 2    6595     36.55    5330     36.84    4180     46.44
      # 7   District 3 Province 3    5487     45.21    5738     42.94    5576     46.19
      # 10 Disctrict 4 Province 4    4695     44.82    6512     37.75    5390     17.11
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 2015-08-03
        相关资源
        最近更新 更多