这是我目前对数据争用的编码。
crime_89 <- crime %>%
filter(state_name %in% c("Georgia", "Pennsylvania", "West Virginia"), !is.na(rape_legacy)) %>%
mutate(treat = case_when(year < 1989 ~ 0,
TRUE ~ 1),
id = case_when(state_name == "Georgia" ~ 1,
state_name == "Pennsylvania" ~ 2,
state_name == "West Virginia" ~ 3),
crime_rate = 100 * (violent_crime + homicide + rape_legacy + robbery + aggravated_assault + property_crime + burglary + larceny + motor_vehicle_theft) / population )
我知道dplyr
中的mutate
是创建新列的工具。
问题在于这个crime89
是从原始数据限制到特定状态的狭窄范围。我想使用包含所有状态列表的原始数据crime
。那么,id
列应该是不同的;从Alaska
开始计数为1 ......到Wyoming
为51。我不知道如何在不使用case_when
的情况下创建id
列。单独输入所有状态。
另外,我还需要根据状态创建treat
列。衡量标准是法律颁布的年份,"1"表示受到待遇的地位。例如,"Georgia", "Pennsylvania", "West Virginia"
是1989年的所以这就是为什么我这样输入::
mutate(treat = case_when(year < 1989 ~ 0,
TRUE ~ 1),
然而,并不是所有的州都有相同的法律年份。例如,"Idaho", "Mississippi", "Oregon"
是1990,所以代码应该是
mutate(treat = case_when(year < 1990 ~ 0,
TRUE ~ 1))
在覆盖所有状态的情况下,我不知道如何在mutate
中同时为不同的状态创建新的treat
列。
这是原始数据head(crime)
,年份从1979年到2016年。
year state_abbr state_name population violent_crime homicide rape_legacy rape_revised robbery aggravated_assault
1 1979 220099000 1208030 21460 76390 NA 480700 629480
2 1979 AK Alaska 406000 1994 54 292 NA 445 1203
3 1979 AL Alabama 3769000 15578 496 1037 NA 4127 9918
4 1979 AR Arkansas 2180000 7984 198 595 NA 1626 5565
5 1979 AZ Arizona 2450000 14528 219 1120 NA 4305 8884
6 1979 CA California 22696000 184087 2952 12239 NA 75767 93129
property_crime burglary larceny motor_vehicle_theft caveats
1 11041500 3327700 6601000 1112800
2 23193 5616 15076 2501
3 144372 48517 83791 12064
4 70949 21457 45267 4225
5 177977 48916 116976 12085
6 1511021 496310 847148 167563
这是你想要做的吗?
我已经将样本数据减少到只需要解决这两个问题。
通过改变状态变量到factor
,你可以得到你想要的顺序。假设按字母顺序排列是可以的,那么您可以创建一个ID列,该列采用因子state_name
的整数。
您可以使用case_when
中的state_abbr
来减少类型,并且我假设treat
然后由year
和匹配状态确定?
library(tidyverse)
crime <- tribble(
~year, ~state_abbr, ~state_name,
1979, "AK", "Alaska",
1979, "AL", "Alabama",
1979, "AR", "Arkansas",
1979, "AZ", "Arizona",
1979, "CA", "California",
1989, "GA", "Georgia",
1989, "PA", "Pennsylvania",
1989, "WV", "West Virginia",
1990, "ID", "Idaho",
1990, "MS", "Mississippi",
1990, "OR", "Oregon"
)
crime %>%
mutate(across(starts_with("state_"), factor),
id = as.integer(state_name),
treat = case_when(
year == 1989 & state_abbr %in% c("GA", "PA", "WV") ~ 1,
year == 1990 & state_abbr %in% c("ID", "MS", "OR") ~ 1,
TRUE ~ 0
)
)
#> # A tibble: 11 × 5
#> year state_abbr state_name id treat
#> <dbl> <fct> <fct> <int> <dbl>
#> 1 1979 AK Alaska 2 0
#> 2 1979 AL Alabama 1 0
#> 3 1979 AR Arkansas 4 0
#> 4 1979 AZ Arizona 3 0
#> 5 1979 CA California 5 0
#> 6 1989 GA Georgia 6 1
#> 7 1989 PA Pennsylvania 10 1
#> 8 1989 WV West Virginia 11 1
#> 9 1990 ID Idaho 7 1
#> 10 1990 MS Mississippi 8 1
#> 11 1990 OR Oregon 9 1
在2022-05-26由reprex包(v2.0.1)创建