Как объединить 2 набора данных, учитывая временную задержку между переменными? - PullRequest
0 голосов
/ 11 апреля 2020

У меня проблемы с объединением двух наборов данных. В идеале для каждой страны переменная year.y должна быть на 3 года позже, чем переменная year.x, чтобы учесть эффект запаздывания. Однако, когда я пытаюсь объединить, year.y, кажется, назначается случайным образом. Кроме того, код также приводит к тому, что количество строк увеличивается излишне, поскольку каждый год.x связан с каждым годом. Y для этой указанной c страны, когда его необходимо связать только с одним годом (year.x +3 ).

> dput(head(corruption))
#Corruption dataset
structure(list(Jurisdiction_c = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan"), 
    year = c("X2001_c", "X2002_c", "X2003_c", "X2004_c", "X2005_c", 
    "X2006_c"), cpi = c(NA, NA, NA, NA, "2.5", NA)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
> dput(head(resource_wealth))
#resource wealth dataset
structure(list(Country.Name_r = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan"), 
    year = c("X1998_r", "X1999_r", "X2000_r", "X2001_r", "X2002_r", 
    "X2003_r"), resource_percentage = c(NA, NA, NA, NA, 1.11398250245278, 
    0.719357369114903)), row.names = c(NA, 6L), class = "data.frame")

Вот строка, которую я использовал для слияния:

dataset_final <-  merge(x = resource_wealth, y = corruption, by.x = "Country.Name_r", by.y = "Jurisdiction_c", all.x = TRUE)
> dput(head(dataset_final))
structure(list(Country.Name_r = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan"), 
    year.x = c("X2005_r", "X2005_r", "X2005_r", "X2005_r", "X2005_r", 
    "X2005_r"), resource_percentage = c(0.38440433910658, 0.38440433910658, 
    0.38440433910658, 0.38440433910658, 0.38440433910658, 0.38440433910658
    ), year.y = c("X2012_c", "X2015_c", "X2007_c", "X2003_c", 
    "X2001_c", "X2002_c"), cpi = c("8", "11", "1.8", NA, NA, 
    NA)), row.names = c(NA, 6L), class = "data.frame")

Вот желаемый результат:

1    Afghanistan X1998_r           <NA>         X2001_c <NA>
2    Afghanistan X1999_r           <NA>         X2002_c <NA>
3    Afghanistan X2000_r           <NA>         X2003_c <NA>
4    Afghanistan X2001_r           <NA>         X2004_c <NA>
5    Afghanistan X2002_r           1.113983e+00 X2005_c 2.5
6    Afghanistan X2003_r           7.193574e-01 X2006_c <NA>

1 Ответ

1 голос
/ 11 апреля 2020

Так как вам осталось присоединиться только к одной клавише, он создаст все совпадающие наблюдения со всеми значениями года. Одним из способов достижения желаемого результата является извлечение значения года из столбца и сохранение только тех лет, где year_y равно year_x + 3.

library(dplyr)

left_join(resource_wealth, corruption, 
           by = c('Country.Name_r' = 'Jurisdiction_c')) %>%
   mutate(year_x = as.numeric(gsub('\\D', '', year.x)), 
          year_y = as.numeric(gsub('\\D', '', year.y))) %>%
  filter(year_y == (year_x + 3))

#  Country.Name_r  year.x resource_percentage  year.y  cpi year_x year_y
#1    Afghanistan X1998_r                  NA X2001_c <NA>   1998   2001
#2    Afghanistan X1999_r                  NA X2002_c <NA>   1999   2002
#3    Afghanistan X2000_r                  NA X2003_c <NA>   2000   2003
#4    Afghanistan X2001_r                  NA X2004_c <NA>   2001   2004
#5    Afghanistan X2002_r           1.1139825 X2005_c  2.5   2002   2005
#6    Afghanistan X2003_r           0.7193574 X2006_c <NA>   2003   2006

Затем вы можете выбрать только те столбцы, которые необходимы, используя select.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...