我想为r中的原始表创建新列



这是我目前对数据争用的编码。

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)创建

相关内容

最新更新