[英]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)]
)
您可以使用tidyr
的complete
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.