【问题标题】:Conditional counters on RR上的条件计数器
【发布时间】:2021-02-28 22:43:40
【问题描述】:

我得到了这个公司数据集,我已经“完成了面板”,所以只要定量变量(销售额、工资)为 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

2014    D        9       5   
2015    D        7       6
2016    D        8       0 
2017    D        0       4
2018    D        NA      NA

而想要的结果是这样的:

Year    Firm    sales   wages  Closure sales  Closure Wages    Closure (both)
2014    A        12      4        0                0                0
2015    A        8       3        0                0                0
2016    A        0       0        1                1                1    # Firm closed here
2017    A        NA      NA       2                2                2    # Doesn't appear on the original df but it's closed
2018    A        NA      NA       3                3                3    # Same here

2014    B        NA      NA       0                0                0    # Firm has not opened yet
2015    B        NA      NA       0                0                0    #Same here
2016    B        4       2        0                0                0
2017    B        9       5        0                0                0
2018    B        8       6        0                0                0

2014    C        9       5        0                0                0  
2015    C        7       6        0                0                0
2016    C        0       0        1                1                1   #Firm closed but still have obligations, so it appears 
2017    C        0       0        2                2                2  # Same
2018    C        0       0        3                3                3  # Same

2014    D        9       5        0                0                0 
2015    D        7       6        0                0                0
2016    D        8       0        0                1                1 #Firm closed by wages criteria, but somehow still sells
2017    D        0       4        1                2                2 #Firm doesn't sell anything, but pays wages.
2018    D        NA      NA       2                3                3  #Firm doesn't have any obligations left. 

我怎样才能做到这一点?

提前致谢。

【问题讨论】:

  • 为什么公司 = B 的所有关闭销售额和关闭工资都是 0。

标签: r database dataframe dplyr tidyverse


【解决方案1】:

这是一个混乱的逻辑。我知道如何做到这一点的唯一方法是使用libr 包中的datastepdatastep 允许您遍历数据框并将条件嵌套到任意深度。

像这样:


library(libr)

df <- read.table(header = TRUE, text = '
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

2014    D        9       5   
2015    D        7       6
2016    D        8       0 
2017    D        0       4
2018    D        NA      NA')

df2 <- datastep(df, by = "Firm",
                retain = list(Closure_Sales = 0, 
                              Closure_Wages = 0, 
                              Closure_Both = 0),
                {
                  
                  # Reset to zero at start of group
                  if (first.) {
                    Closure_Sales <- 0 
                    Closure_Wages <- 0
                    Closure_Both <- 0
                  }
                  
                  # Increment once it gets to 1
                  if (Closure_Sales >= 1)
                    Closure_Sales <- Closure_Sales + 1
                  
                  if (Closure_Wages >= 1)
                    Closure_Wages <- Closure_Wages + 1
                  
                  if (Closure_Both >= 1)
                    Closure_Both <- Closure_Both + 1
                  
                  # Begin counting sales
                  if (!is.na(sales)) {
                    if (sales == 0) {
                      if (Closure_Sales == 0)
                        Closure_Sales <- 1
                      if (Closure_Both == 0)
                        Closure_Both <- 1
                    }
                  }
                  
                  # Begin counting wages
                  if (!is.na(wages)) {
                    if (wages == 0) {
                      if (Closure_Wages == 0)
                        Closure_Wages <- 1
                      if (Closure_Both == 0)
                        Closure_Both <- 1
                    }
                  }
                  
                })

# View results
df2
#    Year Firm sales wages Closure_Sales Closure_Wages Closure_Both
# 1  2014    A    12     4             0             0            0
# 2  2015    A     8     3             0             0            0
# 3  2016    A     0     0             1             1            1
# 4  2017    A    NA    NA             2             2            2
# 5  2018    A    NA    NA             3             3            3
# 6  2014    B    NA    NA             0             0            0
# 7  2015    B     8     3             0             0            0
# 8  2016    B     4     2             0             0            0
# 9  2017    B     9     5             0             0            0
# 10 2018    B     8     6             0             0            0
# 11 2014    C     9     5             0             0            0
# 12 2015    C     7     6             0             0            0
# 13 2016    C     0     0             1             1            1
# 14 2017    C     0     0             2             2            2
# 15 2018    C     0     0             3             3            3
# 16 2014    D     9     5             0             0            0
# 17 2015    D     7     6             0             0            0
# 18 2016    D     8     0             0             1            1
# 19 2017    D     0     4             1             2            2
# 20 2018    D    NA    NA             2             3            3

by 参数激活自动变量first.,它标识了 by 组的开始。 retain 参数允许您访问前一行的值。在datastep 中可以直接访问变量名。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多