fuzzyjoin с датами в R - PullRequest
       44

fuzzyjoin с датами в R

1 голос
/ 05 ноября 2019

Я работаю над проектом, в котором я анализирую данные опросов на индивидуальном уровне внутри стран на основе результатов спортивных матчей в разных странах, и я не уверен, какой самый эффективный способ добиться слияния, который я хочу, - это *. 1001 *

Я работаю над двумя отдельными наборами данных. Один содержит данные индивидуального уровня, вложенные в страны. Данные могут выглядеть примерно так:

country <- c(rep("Country A", 4), rep("Country B", 6))
date <- c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", rep("2000-01-01", 2), "2000-01-02", rep("2000-01-03", 3))
outcome <- rnorm(10)
individual_data <- cbind.data.frame(country, date, outcome)
rm(country, date, outcome)

У других есть данные уровня соответствия страны, которые будут выглядеть примерно так:

date <- rep("2000-01-02", 2)
country <- c("Country A", "Country B")
opponent <- c("Country B", "Country A")
match_outcome <- c("L", "W")
match_data <- cbind.data.frame(date, country, opponent, match_outcome)
rm(date, country, opponent, match_outcome)

В этом примере есть только одно совпадение, сыгранный 2 января 2000 года, когда страна A проиграла стране B. Я хотел бы выполнить fuzzy_join, чтобы в отличие от этого left_join здесь, match_data совпал с individual_data, даже еслидата не точна.

# incorrect
merged <- left_join(individual_data, match_data)

Я хотел бы сделать это с диапазоном в 3 дня, и я хотел бы указать, сколько дней это до и после матча в этом диапазоне. Конечный продукт будет выглядеть примерно так:

country <- c(rep("Country A", 4), rep("Country B", 6))
date <- c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", rep("2000-01-01", 2), "2000-01-02", rep("2000-01-03", 3))
outcome <- rnorm(10)
opponent <- c(rep("Country B", 4), rep("Country A", 6))
match_outcome <- c(rep("L", 4), rep("W", 6))
match_date <- rep("2000-01-02", 10)
difference <- c(-1, 0, 1, 2, -1, -1, 0, rep(1, 3))
desired_output <- cbind.data.frame(country, date, outcome, opponent, match_outcome, match_date, difference)
rm(country, date, outcome, opponent, match_outcome, match_date, difference)

Кто-нибудь может мне помочь? Я действительно боролся с тем, как это сделать. Вот что я пробовал до сих пор:

match_data$match_date_minus3 <- ymd(match_data$date) - days(3)
match_data$match_date_plus3 <- ymd(match_data$date) + days(3)

test_output <- fuzzy_left_join(individual_data, match_data,
                                by = c("country" = "country",
                                       "match_date_minus3" = "date",
                                       "match_date_plus3" = "date"),
                                match_fun = list("==", ">", "<"))

, но я получаю следующую ошибку: Error in which(m) : argument to 'which' is not logical

Для справки, если кто-нибудь знает, я пытаюсь повторить результаты Depeteris-Chauvin et al. 2018 .

1 Ответ

1 голос
/ 05 ноября 2019

Существует три вопроса

  1. Замените двойную кавычку обратной кавычкой внутри match_fun

  2. значения by должны быть обращены

  3. столбцы 'date' изменены на соответствующие Date class


library(fuzzyjoin)
library(dplyr)
individual_data$date <- as.Date(individual_data$date)
match_data$match_date_minus3 <- as.Date(match_data$match_date_minus3)
match_data$match_date_plus3 <- as.Date(match_data$match_date_plus3)
fuzzy_left_join(individual_data, match_data,
                                 by = c("country" = "country",
                                        'date' = "match_date_minus3",
                                        'date' = "match_date_plus3"),
                                 match_fun = list(`==`, `>`, `<`)) %>%
  select(country = country.x, date = date.x, outcome, 
          opponent, match_outcome, match_date = date.y)
#     country       date    outcome  opponent match_outcome match_date
#1  Country A 2000-01-01  1.4003662 Country B             L 2000-01-02
#2  Country A 2000-01-02  0.5526607 Country B             L 2000-01-02
#3  Country A 2000-01-03  0.4316405 Country B             L 2000-01-02
#4  Country A 2000-01-04 -0.1171910 Country B             L 2000-01-02
#5  Country B 2000-01-01  1.3433921 Country A             W 2000-01-02
#6  Country B 2000-01-01 -1.1773011 Country A             W 2000-01-02
#7  Country B 2000-01-02 -0.6953120 Country A             W 2000-01-02
#8  Country B 2000-01-03  1.3484053 Country A             W 2000-01-02
#9  Country B 2000-01-03 -0.7266405 Country A             W 2000-01-02
#10 Country B 2000-01-03 -0.9139988 Country A             W 2000-01-02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...