Как преобразовать tibble из таблицы дат, когда x произошло с таблицей дат с категориальными данными для x - PullRequest
3 голосов
/ 21 сентября 2019

Итак, у меня есть набор данных, который показывает год, в который каждая страна вступила во Всемирную торговую организацию (ВТО) и ее предшественника, Генеральное соглашение по тарифам и торговле (1995 г.).Следует отметить, что ВТО была создана в 1995 году в результате расширения ГАТТ (созданного в 1947 году), и некоторые члены ГАТТ (например, ангола ниже) не вступили в ВТО сразу в 1995 году, но ожидали до 1996 года или позже в зависимости отстрана.Некоторые страны также не были членами ГАТТ, но вступили в ВТО после ее создания (например, Афганистан ниже).

Я хотел бы взять мои данные в формате первого тиббля ниже и изменить формат, чтобы получить списоквсе годы для каждой страны и категорическая переменная, показывающая, были ли они членами ГАТТ, ВТО или еще ни одной.Мой фактический набор данных намного больше этого примера с датами с 1948 по 2017 год, и многие другие страны, делающие это вручную, будут ужасны.

для этого примера, просто ограничив даты с 1992 по 1996 и посмотрев напервые 6 стран, в основном я хотел бы перейти от этого:

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

Я также пыталсяделать некоторые объединения и слияния со списком всех дат, которые я хочу (например,

years <- data.frame(Year = c(1992:1996))
years <- as_tibble(years)

> df3 <- right_join(df2, years)
Joining, by = "Year"
Warning message:
Factor `Country` contains implicit NA, consider using `forcats::fct_explicit_na` 

> df3
# A tibble: 6 x 3
# Groups:   Country [7]
  Country             member_wto_gatt   Year
  <fct>               <chr>            <dbl>
1 NA                  NA                1992
2 NA                  NA                1993
3 Angola              Year_joined_GATT  1994
4 Antigua and Barbuda Year_joined_WTO   1995
5 Argentina           Year_joined_WTO   1995
6 Angola              Year_joined_WTO   1996

), но они были совершенно безуспешными, и я не могу найти подобных примеров того, как это сделать.Любая помощь будет оценена

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Вы можете попробовать использовать gather, complete и fill.gather данные в длинном формате, используйте sub, чтобы иметь имя столбца с "WTO" и "GATT", group_by Country, а затем fill значения NA с последним значением, отличным от NA.

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) 

Для ваших реальных данных вы можете использовать seq(min(Value), max(Value)) вместо жестко заданных лет или, если вы уже знаете, в каких годах должна быть каждая страна, вы можете использовать эти цифры.

0 голосов
/ 21 сентября 2019

С новой версией tidyr (1.0.0) gather, spread будут устаревшими, как указано здесь , и заменены на pivot_longer / pivot_wider и используются только tidyverse функций

library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(cols = starts_with('Year')) %>%
  mutate(name = str_remove(name, 'Year_joined_')) %>% 
  group_by(Country) %>% 
  complete(value = seq(1992, 1996)) %>% 
  fill(name)
# A tibble: 38 x 3
# Groups:   Country [6]
#   Country     value name 
#   <fct>       <dbl> <chr>
# 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> 
# … with 28 more rows
0 голосов
/ 21 сентября 2019

Вот альтернатива, которая объединяется в интересующие годы, а затем использует 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_")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...