【问题标题】:How can I make a counter conditionally on the rows? R如何有条件地在行上创建计数器? R
【发布时间】:2021-02-28 19:58:53
【问题描述】:

我得到了这个公司数据集,我已经“完成了面板”,所以只要定量变量(销售额、工资)为 0,公司就会关闭。 NA 代表我已经完成了面板,这意味着所有公司的年份都相同,但 NA 表示该公司之前(或之后)不存在

我想为公司的第一次倒闭做一个柜台。

所以我的数据看起来像这样:

Year    Firm    sales   wages
2014    A        12      4   
2015    A        8       3
2016    A        0       0 
2017    A        NA      NA 
2018    A        NA      NA 

2014    B        NA      NA   
2015    B        8       3
2016    B        4       2 
2017    B        9       5 
2018    B        8       6 

2014    C        9       5   
2015    C        7       6
2016    C        0       0 
2017    C        0       0
2018    C        0       0

而想要的结果是这样的:

Year    Firm    sales   wages  Closure
2014    A        12      4        0
2015    A        8       3        0
2016    A        0       0        1
2017    A        NA      NA       2  # After the closure in 2016 it doesn't appear on the original dataset anymore
2018    A        NA      NA       3  # Same here

2014    B        NA      NA       0  # Here the firm has not been created yet
2015    B        NA      NA       0  # Here too
2016    B        4       2        0
2017    B        9       5        0
2018    B        8       6        0

2014    C        9       5        0
2015    C        7       6        0
2016    C        0       0        1 
2017    C        0       0        2 #After the closure it continues appearing because the firm has some debts or some pending
2018    C        0       0        3 #Here the same, still appears bc it still have obligations

我怎样才能做到这一点?

提前致谢。

【问题讨论】:

    标签: r database dataframe dplyr tidyverse


    【解决方案1】:

    也许这有帮助

    library(dplyr)
    library(tidyr)
    df1 %>% 
       group_by(Firm) %>% 
       mutate(Closure = replace_na(cumsum(lead(is.na(sales) & 
           is.na(wages), default = TRUE)|(sales == 0 & wages == 0)), 0)) %>%
       ungroup
    

    -输出

    # A tibble: 15 x 5
    #    Year Firm  sales wages Closure
    #   <int> <chr> <int> <int>   <dbl>
    # 1  2014 A        12     4       0
    # 2  2015 A         8     3       0
    # 3  2016 A         0     0       1
    # 4  2017 A        NA    NA       2
    # 5  2018 A        NA    NA       3
    # 6  2014 B        NA    NA       0
    # 7  2015 B         8     3       0
    # 8  2016 B         4     2       0
    # 9  2017 B         9     5       0
    #10  2018 B         8     6       0
    #11  2014 C         9     5       0
    #12  2015 C         7     6       0
    #13  2016 C         0     0       1
    #14  2017 C         0     0       2
    #15  2018 C         0     0       3
    

    数据

    df1 <- structure(list(Year = c(2014L, 2015L, 2016L, 2017L, 2018L, 2014L, 
    2015L, 2016L, 2017L, 2018L, 2014L, 2015L, 2016L, 2017L, 2018L
    ), Firm = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
    "C", "C", "C", "C", "C"), sales = c(12L, 8L, 0L, NA, NA, NA, 
    8L, 4L, 9L, 8L, 9L, 7L, 0L, 0L, 0L), wages = c(4L, 3L, 0L, NA, 
    NA, NA, 3L, 2L, 5L, 6L, 5L, 6L, 0L, 0L, 0L)), class = "data.frame",
    row.names = c(NA, 
    -15L))
    

    【讨论】:

    • 是的,它奏效了。但是我忘了说明如果销售额=0,工资!=0。所以现在我发现我还需要 2 个 cols。我会付钱的,但现在我要再问一次,请帮帮我。
    • @JorgeParedes 我刚刚阅读了您编辑的评论。您能否将其作为一个新问题发布。谢谢
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多