Проблема слияния двух информационных кадров в R (VLOOKUP) - PullRequest
0 голосов
/ 17 мая 2019

Мне нужна помощь в объединении двух фреймов данных с R. Я немного отчаялся, потому что я пробовал все, что мог.Буду признателен за любую помощь.

Дело в том, что я делаю ежедневную проверку в сети, и мне нужно сравнить сегодняшние результаты со вчерашними, чтобы определить, были ли какие-либо изменения.

У меня есть только две переменные (заголовок страницы и URL) в двух фреймах данных (одна на сегодня и одна на вчера), и я хочу объединить их в одну.

Возможные изменения:

  • Изменения в имени.
  • Изменения в URL.
  • Новые программы (новое имя и новый URL).
  • Удаленные программы.

Я пробовал слиянием, кастом и расплавлением, ifelse и т. Д. И т. Д. И я не могу решить проблему.Например:

yesterday <- read.csv2("Yesterday.csv")
today <- read.csv2("Today.csv")
new <- merge(x = today, y = yesterday, all = TRUE, sort = TRUE)

Но без желаемого результата.Я прилагаю три файла:

  • Today.csv , с результатами сегодняшней проверки
  • Yesterdat.csv , сРезультаты вчерашней проверки
  • Results.xlsx с желаемым результатом.VLOOKUP в Excel с выделением изменений, которые я хочу обнаружить (в этом случае имя меняется).

Мне нужно решение для четырех вариантов изменений.Вывод может быть другим, меня это не волнует, но мне нужно, чтобы сравнение было правильным Даже если вы обнаружили, что этот вопрос дублирован, мне нужна ссылка на другой, потому что я не былсмог найти его.

Заранее спасибо.

1 Ответ

2 голосов
/ 17 мая 2019

Ответ обновляется в ответ на комментарии ниже:

library(tidyverse)

bind_rows(

  anti_join(today, yest) %>% 
    mutate(
      label = ifelse(programa %in% yest$programa, 'changed',     'added')
      ),
  anti_join(yest, select(today, programa)) %>%  mutate(label = "deleted")

)

Который, применяя его ко всем наборам данных, возвращает следующие результаты:

# # A tibble: 6 x 3
#   programa                          url                                  label
#   <chr>                             <chr>                                <chr>
# 1 Carrera de Derecho a distancia |~ https://universidadeuropea.es/onlin~ added
# 2 "Carrera de Criminolog\xeda a di~ https://universidadeuropea.es/onlin~ added
# 3 "Carrera Ingenier\xeda Inform\xe~ https://universidadeuropea.es/onlin~ added
# 4 Grado en Derecho a distancia | U~ https://universidadeuropea.es/onlin~ dele~
# 5 "Grado en Criminolog\xeda a dist~ https://universidadeuropea.es/onlin~ dele~
# 6 "Grado Ingenier\xeda Inform\xe1t~ https://universidadeuropea.es/onlin~ dele~

Для проверки, если он может зарегистрировать изменения в программе, мы можем сделать следующее:

yest[22, 2] <- yest[23, 2]

Передача измененных данных в приведенный выше код возвращает таблицу с дополнительной записью, помеченной как changed:

# # A tibble: 7 x 3
#   programa                          url                                  label
#   <chr>                             <chr>                                <chr>
# 1 "M\xe1ster en Direcci\xf3n Hotel~ https://universidadeuropea.es/onlin~ chan~
# 2 Carrera de Derecho a distancia |~ https://universidadeuropea.es/onlin~ added
# 3 "Carrera de Criminolog\xeda a di~ https://universidadeuropea.es/onlin~ added
# 4 "Carrera Ingenier\xeda Inform\xe~ https://universidadeuropea.es/onlin~ added
# 5 Grado en Derecho a distancia | U~ https://universidadeuropea.es/onlin~ dele~
# 6 "Grado en Criminolog\xeda a dist~ https://universidadeuropea.es/onlin~ dele~
# 7 "Grado Ingenier\xeda Inform\xe1t~ https://universidadeuropea.es/onlin~ dele~

Объяснение:

  • Все, что заключено внутри bind_rows(), объединено в единый тибл.Поскольку у нас есть два отдельных оператора anti_join(), и каждый из них возвращает свой собственный тиббл, мы должны rbind их в один;
  • anti_join() - это операция набора, которая, даваядва набора A и B, возвращает другой набор C, который является подмножеством A, но не подмножеством B. Другими словами, C является разницей между A и B.
    • Когда мы вызываем anti_join(today, yest), мы получаем подмножествоtoday с записями либо , отсутствующими в yest, либо с записями program или url, измененными по сравнению с yest.Мы передаем эти результаты в вызов mutate() и присваиваем значение changed значению label, если значение programa такое же, как вчера (programa %in% yest$programa), а значение url было изменено.Если programa %in% yest$programa равно FALSE, это означает, что имя программы отсутствовало в yest, поэтому это новая программа, и мы помечаем ее как added.
    • Когда мы вызываем anti_join()во второй раз мы ищем разницу между именами программ yest и today.Другими словами: «Какие программы, присутствующие в yest, отсутствуют в today?»Мы достигаем этого путем поиска подмножества yest с именами программ, которых нет в именах программ today (поэтому вам необходимо select(today, programa)).Если какая-либо из таких записей обнаружена, они помечены deleted.

Извините, если это объяснение несколько неуклюже, но я надеюсь, что оно поможет вамперейдите по коду .

Данные:

tmp <- tempfile()

download.file(
  "https://drive.google.com/uc?authuser=0&id=1scYdZrGYaSDr-TE8IZsy1tKSdLjMn7jt&export=download",
  tmp
  )

today <- read_delim(tmp, delim = ";")

download.file(
  "https://drive.google.com/uc?authuser=0&id=1uJ-ThiKykTjoY1gc3jlBHoab8WAJD-wP&export=download", 
  tmp
  )

yest <- read_delim(tmp, delim = ";")

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