如何根据另外两个列的唯一对值对列的值进行算术运算

时间:2018-06-21 08:40:11

标签: r

我有这个df

df <- data.frame('ID' = c(1,1,1,1,1,3,4,4,4,5),
                 'YEAR' = c(2002,2002,2002,2003,2003,2005,2010,2010,2010,2008),
                 'WAGES' = c(100,98,60,120,80,300,50,40,30,500));

我想在df中添加一列,其中WAGESYEAR的每个唯一对分别以ID作为最高工资的百分比。因此,结果应如下所示:

R> df
   ID YEAR WAGES  PRC
1   1 2002   100 1.00
2   1 2002    98 0.98
3   1 2002    60 0.60
4   1 2003   120 1.00
5   1 2003    80 0.67
6   3 2005   300 1.00
7   4 2010    50 1.00
8   4 2010    40 0.80
9   4 2010    30 0.60
10  5 2008   500 1.00

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table方法:

library(data.table)
setDT(df)
df[, PRC := WAGES / max(WAGES), by = .(YEAR, ID)]
df
    ID YEAR WAGES       PRC
 1:  1 2002   100 1.0000000
 2:  1 2002    98 0.9800000
 3:  1 2002    60 0.6000000
 4:  1 2003   120 1.0000000
 5:  1 2003    80 0.6666667
 6:  3 2005   300 1.0000000
 7:  4 2010    50 1.0000000
 8:  4 2010    40 0.8000000
 9:  4 2010    30 0.6000000
10:  5 2008   500 1.0000000

但是,如果您更喜欢旧的好基数R,那么这里是一个解决方案。

mw_yid <- aggregate(WAGES ~ paste(ID, YEAR), df, max)
mw_yid
  paste(ID, YEAR) WAGES
1          1 2002   100
2          1 2003   120
3          3 2005   300
4          4 2010    50
5          5 2008   500
df$PRC <- df$WAGES / mw_yid[[2]][match(paste(df$ID, df$YEAR), mw_yid[[1]])]
df
   ID YEAR WAGES       PRC
1   1 2002   100 1.0000000
2   1 2002    98 0.9800000
3   1 2002    60 0.6000000
4   1 2003   120 1.0000000
5   1 2003    80 0.6666667
6   3 2005   300 1.0000000
7   4 2010    50 1.0000000
8   4 2010    40 0.8000000
9   4 2010    30 0.6000000
10  5 2008   500 1.0000000

答案 1 :(得分:0)

我们可以使用tidyverse方法:

library(tidyverse)

df <- df %>% group_by(YEAR, ID) %>% mutate(PRC = WAGES/max(WAGES))

> df
# A tibble: 10 x 4
# Groups:   YEAR, ID [5]
      ID  YEAR WAGES       PRC
   <dbl> <dbl> <dbl>     <dbl>
 1     1  2002   100 1.0000000
 2     1  2002    98 0.9800000
 3     1  2002    60 0.6000000
 4     1  2003   120 1.0000000
 5     1  2003    80 0.6666667
 6     3  2005   300 1.0000000
 7     4  2010    50 1.0000000
 8     4  2010    40 0.8000000
 9     4  2010    30 0.6000000
10     5  2008   500 1.0000000