如何将x发生时的日期表中的小标题转换为具有x的分类数据的日期表

时间:2019-09-21 14:04:00

标签: r dataframe dplyr

因此,我有一个数据集,显示每个国家加入世界贸易组织(WTO)及其前身《关税与贸易总协定》(1995年)的年份。需要注意的重要一点是,WTO于1995年作为关贸总协定(创建于1947年成立)的扩展而创建,一些GATT成员(例如安哥拉以下国家)并未在1995年立即加入WTO,而是一直等到1996年或更晚,具体取决于国家。一些国家也不是关贸总协定的成员,而是在WTO成立后加入了WTO(例如以下的阿富汗)。

我想以下面的第一个小节的格式获取数据,并将格式更改为包含每个国家/地区的所有年份的列表以及一个明确的变量,以显示它们是否是关贸总协定,世贸组织的成员,或者都不是然而。我的实际数据集比这个示例的日期要大得多,该示例的日期是1948年到2017年,而且还有更多的国家/地区,因此手动执行此操作会很糟糕。

在此示例中,仅将日期限制为1992年至1996年,并查看了前6个国家/地区,基本上,我想从此开始:

<fragment
    android:name="com.test.livedatatestapp.LiveDataTestFragment"
    android:id="@+id/fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

对此:

df <- data.frame(Country = c("Afghanistan", "Albania", "Angola", "Antigua and Barbuda", "Argentina", "Armenia"), 
                 Year_joined_WTO = c(2016, 2000, 1996, 1995, 1995, 2003),
                 Year_joined_GATT = c(NA, NA, 1994, 1987, 1967, NA))
df <- as_tibble(df)

> df
# A tibble: 6 x 3
  Country             Year_joined_WTO Year_joined_GATT
  <fct>                         <dbl>            <dbl>
1 Afghanistan                    2016               NA
2 Albania                        2000               NA
3 Angola                         1996             1994
4 Antigua and Barbuda            1995             1987
5 Argentina                      1995             1967
6 Armenia                        2003               NA

我尝试将年份汇总到一个栏中,但是我遇到的问题是如何在一个栏中显示每个国家的每年情况,以及如何在加入后的几年中显示出他们的身份。

我微弱的尝试:

df_intended <- data.frame(Country = c("Afghanistan", "Afghanistan","Afghanistan","Afghanistan","Afghanistan", "Albania", "Albania","Albania","Albania","Albania","Angola", "Angola","Angola","Angola","Angola","Antigua and Barbuda","Antigua and Barbuda","Antigua and Barbuda","Antigua and Barbuda","Antigua and Barbuda", "Argentina", "Argentina","Argentina","Argentina","Argentina","Armenia","Armenia","Armenia","Armenia","Armenia"), 
                 Year = c(1992, 1993, 1994, 1995, 1996, 1992, 1993, 1994, 1995, 1996,1992, 1993, 1994, 1995, 1996,1992, 1993, 1994, 1995, 1996,1992, 1993, 1994, 1995, 1996,1992, 1993, 1994, 1995, 1996),
                 Member_WTO_GATT = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "GATT", "GATT", "WTO", "GATT","GATT","GATT", "WTO", "WTO", "GATT","GATT","GATT", "WTO", "WTO", NA, NA, NA, NA, NA))
df_intended <- as_tibble(df_intended)

print(tbl_df(df_intended), n =30)

# A tibble: 30 x 3
   Country              Year Member_WTO_GATT
   <fct>               <dbl> <fct>          
 1 Afghanistan          1992 NA             
 2 Afghanistan          1993 NA             
 3 Afghanistan          1994 NA             
 4 Afghanistan          1995 NA             
 5 Afghanistan          1996 NA             
 6 Albania              1992 NA             
 7 Albania              1993 NA             
 8 Albania              1994 NA             
 9 Albania              1995 NA             
10 Albania              1996 NA             
11 Angola               1992 NA             
12 Angola               1993 NA             
13 Angola               1994 GATT           
14 Angola               1995 GATT           
15 Angola               1996 WTO            
16 Antigua and Barbuda  1992 GATT           
17 Antigua and Barbuda  1993 GATT           
18 Antigua and Barbuda  1994 GATT           
19 Antigua and Barbuda  1995 WTO            
20 Antigua and Barbuda  1996 WTO            
21 Argentina            1992 GATT           
22 Argentina            1993 GATT           
23 Argentina            1994 GATT           
24 Argentina            1995 WTO            
25 Argentina            1996 WTO            
26 Armenia              1992 NA             
27 Armenia              1993 NA             
28 Armenia              1994 NA             
29 Armenia              1995 NA             
30 Armenia              1996 NA  

我也尝试过进行一些合并,并合并所有想要的日期列表(例如

df2 <- df %>% 
  group_by(Country) %>% 
  gather(Year_joined_WTO, Year_joined_GATT, key = member_wto_gatt, value = Year)

> df2
# A tibble: 12 x 3
# Groups:   Country [6]
   Country             member_wto_gatt   Year
   <fct>               <chr>            <dbl>
 1 Afghanistan         Year_joined_WTO   2016
 2 Albania             Year_joined_WTO   2000
 3 Angola              Year_joined_WTO   1996
 4 Antigua and Barbuda Year_joined_WTO   1995
 5 Argentina           Year_joined_WTO   1995
 6 Armenia             Year_joined_WTO   2003
 7 Afghanistan         Year_joined_GATT    NA
 8 Albania             Year_joined_GATT    NA
 9 Angola              Year_joined_GATT  1994
10 Antigua and Barbuda Year_joined_GATT  1987
11 Argentina           Year_joined_GATT  1967
12 Armenia             Year_joined_GATT    NA

) 但是它们完全失败了,我找不到任何类似的示例来做到这一点。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

您可以尝试使用gathercompletefill。将数据gather转换为长格式,使用sub将列名分别用"WTO""GATT"group_by Country然后{{1} }具有最新非NA值的NA值。

fill

对于真实数据,您可以使用library(dplyr) library(tidyr) df %>% gather(key, Value, -Country) %>% mutate(key = sub("Year_joined_", "", key)) %>% group_by(Country) %>% complete(Value = seq(1992, 1996)) %>% fill(key) 而不是硬编码年份,或者如果您已经知道每个国家应该拥有的年份,则可以使用这些数字。

答案 1 :(得分:0)

这是一种在感兴趣的年份合并然后在成员资格列中使用case_when()的替代方法。

library(dplyr) 

df %>%
  merge(data.frame(year = 1992:1996), .) %>%
  mutate(Member_WTO_GATT = case_when(Year_joined_WTO <= year  ~ "WTO",
                                     Year_joined_GATT <= year ~ "GATT",
                                     TRUE~ NA_character_)) %>%
  select(-(starts_with("Year_")))

答案 2 :(得分:0)

对于新版本的tidyr(1.0.0),gatherspreadhere会被弃用,并替换为pivot_longer / { {1}},仅使用pivot_wider个功能

tidyverse