我有这个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中添加一列,其中WAGES
和YEAR
的每个唯一对分别以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
答案 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