[英]How do I create a column based on a change in factor varible in another column?
我有以下數據框,其中包含每個縣隨時間變化的支出水平信息,以及該縣的居家要求。 居家要求從 0 到 2,其中 2 表示更嚴格的鎖定:
# A tibble: 47,898 x 4
countyfips date C6_Stay_at_home_requirements spend_all
<dbl> <chr> <dbl> <dbl>
1 1001 20200112 0 -0.0831
2 1001 20200119 0 0.0038
3 1001 20200126 0 0.0917
4 1001 20200202 0 -0.00724
5 1001 20200209 0 0.00567
6 1001 20200216 0 0.125
7 1001 20200223 0 -0.0929
8 1001 20200301 0 -0.0455
9 1001 20200308 0 0.108
10 1001 20200315 0 0.212
# … with 47,888 more rows
我想創建一個名為 WeekAfterReopening1to0 的新列,當政策從 1 放寬到 0 時,該列將為 0。然后該列的值每周增加 1。 不過,在重新開放之前,我想要負數。 例如,如果縣沒有從 2 更改為 0,則所有值都為 NA。
然后,如果變量從 2 變為 0,如果它從 2 變為 1,我想做類似的事情,只是列名不同(WeekAfterReopening2to0 和 WeekAfterReopening2to1)。
最終結果可能如下所示:
# A tibble: 47,898 x 6
countyfips date C6_Stay_at_home_requirements WeekAfterReopening2to1 WeekAfterReopening1to0 WeekAfterReopening2to0
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 1001 20200112 0 -3 -5 NA
2 1001 20200119 2 -2 -4 NA
3 1001 20200126 2 -1 -3 NA
4 1001 20200202 1 0 -2 NA
5 1001 20200209 1 1 -1 NA
6 1001 20200216 0 2 0 NA
7 1001 20200223 0 3 1 NA
8 1001 20200301 0 4 2 NA
9 1001 20200308 0 5 3 NA
10 1001 20200315 0 6 4 NA
# … with 47,888 more rows
我正在考慮使用 dplyr 函數 mutate 和排列,但我不知道如何將這些函數組合在一起,因為我認為這超出了我的 r 能力。
任何幫助表示贊賞,謝謝。
使用dplyr
,這可以通過以下方式完成:
df %>%
arrange(date) %>%
mutate(Reopening1to0 = (C6_Stay_at_home_requirements == 0) & (lag(C6_Stay_at_home_requirements, default = -1) == 1),
WeekAfterReopening1to0 = row_number() - which.max(Reopening1to0))
首先,對於每一行,我們檢查C6_Stay_at_home_requirements
列的值是否為 0,其前驅的值是否為 1。然后,我們從新創建的列上具有TRUE
值的行號中減去當前行號,從而找到有多少行遠離當前行。
這可以合並為一行,但我認為這樣更清楚。
這使
countyfips date C6_Stay_at_home_requirements spend_all Reopening1to0 WeekAfterReopening1to0
1 1001 20200112 0 -0.08310 FALSE -5
2 1001 20200119 2 0.00380 FALSE -4
3 1001 20200126 2 0.09170 FALSE -3
4 1001 20200202 1 -0.00724 FALSE -2
5 1001 20200209 1 0.00567 FALSE -1
6 1001 20200216 0 0.12500 TRUE 0
7 1001 20200223 0 -0.09290 FALSE 1
8 1001 20200301 0 -0.04550 FALSE 2
9 1001 20200308 0 0.10800 FALSE 3
10 1001 20200315 0 0.21200 FALSE 4
輸入數據:
df <- read.table(text = "countyfips date C6_Stay_at_home_requirements spend_all
1 1001 20200112 0 -0.0831
2 1001 20200119 2 0.0038
3 1001 20200126 2 0.0917
4 1001 20200202 1 -0.00724
5 1001 20200209 1 0.00567
6 1001 20200216 0 0.125
7 1001 20200223 0 -0.0929
8 1001 20200301 0 -0.0455
9 1001 20200308 0 0.108
10 1001 20200315 0 0.212")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.