【问题标题】:Create sequence by condition in the case when condition changes在条件发生变化的情况下按条件创建序列
【发布时间】:2021-04-13 12:52:19
【问题描述】:

数据如下:

df <- data.frame("Grp"=c(rep("A",10),rep("B",10)),
             "Year"=c(seq(2001,2010,1),seq(2001,2010,1)),
             "Treat"=c(as.character(c(0,0,1,1,1,1,0,0,1,1)),
                                   as.character(c(1,1,1,0,0,0,1,1,1,0))))
df
   Grp Year Treat
1    A 2001     0
2    A 2002     0
3    A 2003     1
4    A 2004     1
5    A 2005     1
6    A 2006     1
7    A 2007     0
8    A 2008     0
9    A 2009     1
10   A 2010     1
11   B 2001     1
12   B 2002     1
13   B 2003     1
14   B 2004     0
15   B 2005     0
16   B 2006     0
17   B 2007     1
18   B 2008     1
19   B 2009     1
20   B 2010     0

我想要的只是生成另一个列seq 以通过Grp 计算Treat 的序列,保持Year 的序列。我认为困难的部分是当Treat 变为0 时,seq 应该为0 或其他,并且当Treat 的序列再次变回非零时应该重新计算。最终数据框的示例如下所示:

   Grp Year Treat seq
1    A 2001     0   0
2    A 2002     0   0
3    A 2003     1   1
4    A 2004     1   2
5    A 2005     1   3
6    A 2006     1   4
7    A 2007     0   0
8    A 2008     0   0
9    A 2009     1   1
10   A 2010     1   2
11   B 2001     1   1
12   B 2002     1   2
13   B 2003     1   3
14   B 2004     0   0
15   B 2005     0   0
16   B 2006     0   0
17   B 2007     1   1
18   B 2008     1   2
19   B 2009     1   3
20   B 2010     0   0

任何建议将不胜感激!

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    使用 data.table rleid ,您可以:

    library(dplyr)
    
    df %>%
      group_by(Grp, grp = data.table::rleid(Treat)) %>%
      mutate(seq = row_number() * as.integer(Treat)) %>%
      ungroup %>%
      select(-grp)
    
    #   Grp    Year Treat   seq
    #   <chr> <dbl> <chr> <int>
    # 1 A      2001 0         0
    # 2 A      2002 0         0
    # 3 A      2003 1         1
    # 4 A      2004 1         2
    # 5 A      2005 1         3
    # 6 A      2006 1         4
    # 7 A      2007 0         0
    # 8 A      2008 0         0
    # 9 A      2009 1         1
    #10 A      2010 1         2
    #11 B      2001 1         1
    #12 B      2002 1         2
    #13 B      2003 1         3
    #14 B      2004 0         0
    #15 B      2005 0         0
    #16 B      2006 0         0
    #17 B      2007 1         1
    #18 B      2008 1         2
    #19 B      2009 1         3
    #20 B      2010 0         0
    

    【讨论】:

    • 完美运行!以前从未使用过rleid。非常感谢!在接受你的回答之前,我会等待一些其他的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2011-01-23
    • 2017-02-14
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多