簡體   English   中英

R如何展開連續計數?

[英]How to expand and count consecutively in R?

如何擴展數據集並按年連續計數?

具體來說,我的數據集有 15 行和 4 列:公司 ID、行業代碼、年份和月份。 該數據在 2 年內有 15 個月度信息。 在該月觀察到一家采取月度行動的公司。 如果每個月都觀察每家公司,我就會有 30obs。 我想擴展數據,以便將未采取每月行動的公司記錄為 0,將采取行動的公司記錄為 1。我生成了一系列 3 個變量。 第一個是 Treat,如果公司以前在數據集中,則等於 1,如果添加了公司的 obs(因為他們沒有在該月采取行動),則為 0。 例如,公司 1 將有六個 1,而公司 2 將有一個。 當月 = 3 且年 = 2010 時。 接下來,我生成 Treat2,它會替換。 與 0 並保持 1s 不變。 最后,我生成了一個變量 Treat3,它計算給定公司是否在一年內至少連續采取了三次行動。

這是原始數據的樣子:

公司_ID1 部門
1個 1個 2010 1個
1個 1個 2010 2個
1個 1個 2010 3個
1個 1個 2011年 1個
1個 1個 2011年 2個
1個 1個 2011年 3個
2個 1個 2010 1個
2個 1個 2010 2個
2個 1個 2011年 1個
2個 1個 2011年 2個
3個 1個 2010 1個
4個 2個 2011年 1個
4個 2個 2011年 2個
5個 2個 2011年 2個
5個 2個 2011年 3個

這就是我要找的

公司_ID1 部門 對待 對待1 對待2
1個 1個 2010 1個 1個 1個 1個
1個 1個 2010 2個 1個 1個 1個
1個 1個 2010 3個 1個 1個 1個
1個 1個 2011年 1個 1個 1個 1個
1個 1個 2011年 2個 1個 1個 1個
1個 1個 2011年 3個 1個 1個 1個
2個 1個 2010 1個 1個 1個 1個
2個 1個 2010 2個 1個 1個 1個
2個 1個 2010 3個 . 0 0
2個 1個 2011年 1個 1個 1個 0
2個 1個 2011年 2個 1個 1個 0
2個 1個 2011年 3個 . 0 0
3個 1個 2010 1個 1個 1個 0
3個 1個 2010 2個 . 0 0
3個 1個 2010 3個 . 0 0
3個 1個 2011年 1個 . 0 0
3個 1個 2011年 2個 . 0 0
3個 1個 2011年 3個 . 0 0
4個 2個 2010 1個 . 0 0
4個 2個 2010 2個 . 0 0
4個 2個 2010 3個 . 0 0
4個 2個 2011年 1個 1個 0 0
4個 2個 2011年 2個 1個 0 0
4個 2個 2011年 3個 . 0 0
5個 2個 2010 1個 . 0 0
5個 2個 2010 2個 . 0 0
5個 2個 2010 3個 . 0 0
5個 2個 2011年 1個 . 0 0
5個 2個 2011年 2個 1個 1個 0
5個 2個 2011年 3個 1個 1個 0

這是我嘗試但沒有成功的方法:

  dfdata1 <- dfdata %>%
    group_by(Firm_ID1,Year)%>%
    mutate(isconsecutive =duplicated(rbind(dfdata, transform(dfdata, Month=Month+1), transform(dfdata, Month= Month-1)), fromLast = TRUE)[1:nrow(dfdata)]
    )
  

您可以使用tidyrcomplete function:

library(dplyr)
library(tidyr)

data %>%
  complete(Firm_ID1, Year, Month) %>% 
  mutate(Treat2 = +!is.na(Sector)) %>% 
  group_by(Firm_ID1, Year) %>% 
  mutate(Treat3 = +all(
    !is.na(Sector), 
    !is.na(lag(Sector, n = 1, default = TRUE)), 
    !is.na(lag(Sector, n = 2, default = TRUE))
    )
    ) %>% 
  ungroup() 

這返回

# A tibble: 30 x 6
   Firm_ID1  Year Month Sector Treat2 Treat3
      <dbl> <dbl> <dbl>  <dbl>  <int>  <int>
 1        1  2010     1      1      1      1
 2        1  2010     2      1      1      1
 3        1  2010     3      1      1      1
 4        1  2011     1      1      1      1
 5        1  2011     2      1      1      1
 6        1  2011     3      1      1      1
 7        2  2010     1      1      1      0
 8        2  2010     2      1      1      0
 9        2  2010     3     NA      0      0
10        2  2011     1      1      1      0
11        2  2011     2      1      1      0
12        2  2011     3     NA      0      0
13        3  2010     1      1      1      0
14        3  2010     2     NA      0      0
15        3  2010     3     NA      0      0
16        3  2011     1     NA      0      0
17        3  2011     2     NA      0      0
18        3  2011     3     NA      0      0
19        4  2010     1     NA      0      0
20        4  2010     2     NA      0      0
21        4  2010     3     NA      0      0
22        4  2011     1      2      1      0
23        4  2011     2      2      1      0
24        4  2011     3     NA      0      0
25        5  2010     1     NA      0      0
26        5  2010     2     NA      0      0
27        5  2010     3     NA      0      0
28        5  2011     1     NA      0      0
29        5  2011     2      2      1      0
30        5  2011     3      2      1      0

我跳過了. Treat one 的一部分,因為它破壞了 integer 類型。 如果需要,很容易創建。

這是一種不同的data.table方法...不確定這是否是您要找的,但這就是我處理事情的方式

library(data.table)
# cast to wide and calculate length
new_DT <- dcast(DT, Firm_ID1 + Year ~ Month, value.var = "Firm_ID1", 
                fun.aggregate = length, drop = FALSE)
# calculate year actions
new_DT[, Treat2 := ifelse(rowSums(.SD) >= 3, 1, 0), .SDcols = patterns("^[0-9]+$")][]
#    Firm_ID1 Year 1 2 3 Treat2
# 1:        1 2010 1 1 1      1
# 2:        1 2011 1 1 1      1
# 3:        2 2010 1 1 0      0
# 4:        2 2011 1 1 0      0
# 5:        3 2010 1 0 0      0
# 6:        3 2011 0 0 0      0
# 7:        4 2010 0 0 0      0
# 8:        4 2011 1 1 0      0
# 9:        5 2010 0 0 0      0
#10:        5 2011 0 1 1      0
 

樣本數據

DT <- fread("Firm_ID1   Sector  Year    Month
1   1   2010    1
1   1   2010    2
1   1   2010    3
1   1   2011    1
1   1   2011    2
1   1   2011    3
2   1   2010    1
2   1   2010    2
2   1   2011    1
2   1   2011    2
3   1   2010    1
4   2   2011    1
4   2   2011    2
5   2   2011    2
5   2   2011    3")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM