尝试将数据长格式转换为宽格式

时间:2017-10-11 05:43:09

标签: r

我的数据框目前看起来像

country_txt  Year nkill_yr Countrycode Population deathsPer100k
        <chr> <dbl>    <dbl>       <dbl>      <dbl>         <dbl>
1 Afghanistan  1973        0           4      12028  0.000000e+00
2 Afghanistan  1979       53           4      13307  3.982866e-05
3 Afghanistan  1987        0           4      11503  0.000000e+00
4 Afghanistan  1988      128           4      11541  1.109089e-04
5 Afghanistan  1989       10           4      11778  8.490406e-06
6 Afghanistan  1990       12           4      12249  9.796718e-06

它包含一个国家列表,以及每100,000人中的恐怖主义死亡人数。

理想情况下,我希望宽格式的数据框具有以下结构:

country_txt 1970 1971 1972  1973 1974 1975
Afghanistan 3.98 1.1  0     4.3  0.8  0.09
Albania     0    0.4  0.5   0    0    0
Algeria     0    0    0     0.1  0.2  0
Angola      0    0.3  0     0    0    0

除了我的功能目前重复如下:

YearCountryRatio<- spread(data = YearCountryRatio, Year, deathsPer100k )

country_txt 1970 1971 1972 1973
Afghanistan 3.98 NA   NA   NA
Afghanistan NA   1.1  NA   NA
Afghanistan NA   NA   0    NA
Afghanistan NA   NA   NA   4.3

与其他国家类似,

有没有办法:

  1. 折叠所有NA值以仅显示一个国家/地区或
  2. 直接放入宽屏?

1 个答案:

答案 0 :(得分:0)

我假设您希望每个country_txt值减少到一行,并且乐于删除未使用的变量。 (注意:我在示例数据中添加了country_txt虚拟"XYZ"值,以显示多个国家/地区如何传播)

library(dplyr)
library(tidyr)

df <- read.table(text = "country_txt  Year nkill_yr Countrycode Population deathsPer100k
1 Afghanistan  1973        0           4      12028  0.000000e+00
2 Afghanistan  1979       53           4      13307  3.982866e-05
3 Afghanistan  1987        0           4      11503  0.000000e+00
4 XYZ          1988      128           4      11541  1.109089e-04
5 XYZ          1989       10           4      11778  8.490406e-06
6 XYZ          1990       12           4      12249  9.796718e-06", header = TRUE)

df <- mutate(df, deathsPer100k = round(deathsPer100k*100000, 2))
select(df, country_txt, Year, deathsPer100k) %>% spread(Year, deathsPer100k, fill = 0)
#>   country_txt 1973 1979 1987  1988 1989 1990
#> 1 Afghanistan    0 3.98    0  0.00 0.00 0.00
#> 2         XYZ    0 0.00    0 11.09 0.85 0.98