【问题标题】:dividing cells by subtotal of a dataframe in R按R中数据框的小计划分单元格
【发布时间】:2025-12-30 00:00:11
【问题描述】:

这是一个初学者的问题,但来自 Stata,这对我来说似乎很棘手。如有任何提示,我将不胜感激。

我有一个包含变量 District_id、年份、派对和投票的数据框。我想将每个地区每年每个党派的选票(=每一行)除以该党今年的总票数(=这里以块显示)。那么一个地区对收到的总票数贡献了多少百分比一年一个派对?

结构是

 district_i year    party   votes

  1 2001    party1   24
  2 2001    party1   56
  3 2001    party1   12

  1 2002    party1   40
  2 2002    party1   749
  3 2002    party1   26

  1 2001    party2   34
  2 2001    party2   48
  3 2001    party2   23

  1 2002    party2   34
  2 2002    party2   48
  3 2002    party2   98

我为每个政党/地区/年组创建了小计

agg <- aggregate(df$votes, list(df$party, df$year), FUN="sum")

但是如何通过 agg 中存储的结果来划分数据框中的单元格? 最后,我希望有一个包含百分比的新列。

有没有更简单的方法(比如Stata中的egen .. by:)?

【问题讨论】:

    标签: r dataframe aggregate subset


    【解决方案1】:

    像这样?

    DF <- read.table(text="district_i year    party   votes
      1 2001    party1   24
      2 2001    party1   56
      3 2001    party1   12
      1 2002    party1   40
      2 2002    party1   749
      3 2002    party1   26
      1 2001    party2   34
      2 2001    party2   48
      3 2001    party2   23
      1 2002    party2   34
      2 2002    party2   48
      3 2002    party2   98", header=TRUE)
    
    library(plyr)
    ddply(DF, .(year,party), transform, contrib = votes / sum(votes))
    
    #    district_i year  party votes    contrib
    # 1           1 2001 party1    24 0.26086957
    # 2           2 2001 party1    56 0.60869565
    # 3           3 2001 party1    12 0.13043478
    # 4           1 2001 party2    34 0.32380952
    # 5           2 2001 party2    48 0.45714286
    # 6           3 2001 party2    23 0.21904762
    # 7           1 2002 party1    40 0.04907975
    # 8           2 2002 party1   749 0.91901840
    # 9           3 2002 party1    26 0.03190184
    # 10          1 2002 party2    34 0.18888889
    # 11          2 2002 party2    48 0.26666667
    # 12          3 2002 party2    98 0.54444444
    

    【讨论】:

      【解决方案2】:

      试试这个:

      transform(df, percent = 100 * ave(votes, year, party, FUN = prop.table))
      

      【讨论】: