使用group_by和rleid()函数创建一个新变量

时间:2019-07-04 16:53:30

标签: r dplyr data.table tidyverse

我想在R中使用dplyr创建一个新变量 这是数据-

year  TICKER   auditor_fkey  pauditor_fkey  AUDTURNOVER
1  2001    AIR            4            NA          NA
2  2002    AIR            4             4           0
3  2003    AIR            4             4           0
4  2004    AIR            4             4           0
5  2005    AIR            4             4           0
6  2006    AIR            4             4           0
7  2007    AIR            4             4           0
8  2008    AIR            4             4           0
9  2009    AIR            4             4           0
10 2010    AIR            4             4           0
11 2011    AIR            4             4           0
12 2012    AIR            4             4           0
13 2013    AIR            4             4           0
14 2014    AIR            4             4           0
15 2015    AIR            4             4           0
16 2016    AIR            4             4           0
17 2017    AIR            4             4           0
18 2000    ABT            5            NA          NA
19 2001    ABT            5             5           0
20 2002    ABT            3             5           1
21 2003    ABT            3             3           0
22 2004    ABT            3             3           0
23 2005    ABT            3             3           0
24 2006    ABT            3             3           0
25 2007    ABT            3             3           0
26 2008    ABT            3             3           0
27 2009    ABT            3             3           0
28 2010    ABT            3             3           0
29 2011    ABT            3             3           0
30 2012    ABT            3             3           0
31 2013    ABT            3             3           0
32 2014    ABT            2             3           1
33 2015    ABT            2             2           0
34 2016    ABT            2             2           0
35 2017    ABT            2             2           0

我使用以下代码创建了“ pauditor_fkey”变量

my_data <- my_data%>%
  group_by(TICKER) %>% 
  mutate(pauditor_fkey = lag (auditor_fkey))

这里,年份=一年; TICKER =公司的标识符; audit_fkey =标识在一年内对公司进行过审计的审计师(例如,“ 2001”中的审计师“ 4”被审计公司“ AIR”); pauditor_fkey =上一年的审计师; AUDTURNOVER =如果在特定年份中,审计师发生了变化我将它们编码为1,否则为0。 现在,我要使用上述变量创建一个名为 AUDITOR_TENURE 的新变量 运行代码后,数据应如下所示-

year  TICKER   auditor_fkey   pauditor_fkey  AUDTURNOVER  AUDITOR_TENURE
1  2001    AIR            4            NA          NA              1
2  2002    AIR            4             4           0              2
3  2003    AIR            4             4           0              3
4  2004    AIR            4             4           0              4
5  2005    AIR            4             4           0              5
6  2006    AIR            4             4           0              6
7  2007    AIR            4             4           0              7
8  2008    AIR            4             4           0              8
9  2009    AIR            4             4           0              9
10 2010    AIR            4             4           0             10
11 2011    AIR            4             4           0             11
12 2012    AIR            4             4           0             12
13 2013    AIR            4             4           0             13
14 2014    AIR            4             4           0             14
15 2015    AIR            4             4           0             15
16 2016    AIR            4             4           0             16
17 2017    AIR            4             4           0             17
18 2000    ABT            5            NA          NA              1
19 2001    ABT            5             5           0              2
20 2002    ABT            3             5           1              1
21 2003    ABT            3             3           0              2
22 2004    ABT            3             3           0              3
23 2005    ABT            3             3           0              4
24 2006    ABT            3             3           0              5
25 2007    ABT            3             3           0              6
26 2008    ABT            3             3           0              7
27 2009    ABT            3             3           0              8
28 2010    ABT            3             3           0              9
29 2011    ABT            3             3           0             10
30 2012    ABT            3             3           0             11
31 2013    ABT            3             3           0             12
32 2014    ABT            2             3           1              1
33 2015    ABT            2             2           0              2
34 2016    ABT            2             2           0              3
35 2017    ABT            2             2           0              4

如果检查了AUDITOR_TENURE变量,则可以看出对于TICKER == AIR,审核器没有变化;因此,AUDITOR_TENURE增加。对于TICKER == ABT,可以看出在2000年和2001年,审计师没有任何变动。因此该审计员在当年的AUDITOR_TENURE分别为1和2。但是,在2002年,ABT的审核员发生了变化,该审核员将继续工作到2013年,因此将为他们生成AUDITOR_TENURE变量的新编号。然后在2015年,他们再次更换审核员,审核员继续工作至2017年,并据此计算其任期。

我使用了以下代码-

my_data <- my_data %>%  
  group_by(TICKER, group = rleid(auditor_fkey)) %>%
  mutate(AUDITOR_TENURE = row_number()) %>%
  ungroup() 

或者,这个-

my_data <- my_data %>%  
  group_by(TICKER, group = cumsum(auditor_fkey != 
                                    lag(auditor_fkey, default = first(auditor_fkey)))) %>%
  mutate(AUDITOR_TENURE = row_number()) %>%
  ungroup() 

对于这两种情况,我都得到了这些结果-这是不正确的。

    year TICKER auditor_fkey AUDTURNOVER group AUDITOR_TENURE
1  2001    AIR            4          NA     3              1
2  2002    AIR            4           0     6              1
3  2003    AIR            4           0     9              1
4  2004    AIR            4           0    12              1
5  2005    AIR            4           0    15              1
6  2006    AIR            4           0    18              1
7  2007    AIR            4           0    21              1
8  2008    AIR            4           0    24              1
9  2009    AIR            4           0    28              1
10 2010    AIR            4           0    32              1
11 2011    AIR            4           0    35              1
12 2012    AIR            4           0    38              1
13 2013    AIR            4           0    41              1
14 2014    AIR            4           0    44              1
15 2015    AIR            4           0    47              1
16 2016    AIR            4           0    50              1
17 2017    AIR            4           0    53              1
18 2000    ABT            5          NA     1              1
19 2001    ABT            5           0     4              1
20 2002    ABT            3           1     7              1
21 2003    ABT            3           0    10              1
22 2004    ABT            3           0    13              1
23 2005    ABT            3           0    16              1
24 2006    ABT            3           0    19              1
25 2007    ABT            3           0    22              1
26 2008    ABT            3           0    25              1
27 2009    ABT            3           0    29              1
28 2010    ABT            3           0    33              1
29 2011    ABT            3           0    36              1
30 2012    ABT            3           0    39              1
31 2013    ABT            3           0    42              1
32 2014    ABT            2           1    45              1
33 2015    ABT            2           0    48              1
34 2016    ABT            2           0    51              1
35 2017    ABT            2           0    54              1

1 个答案:

答案 0 :(得分:0)

使用data.table,它将只是DT[, AUDITOR_TENURE := rowid(TICKER, auditor_fkey)]