Проблема слияния двух информационных кадров в R (VLOOKUP)

Мне нужна помощь в объединении двух фреймов данных с 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 ответ


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

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 Criminologxeda a di~ https://universidadeuropea.es/onlin~ added
# 3 "Carrera Ingenierxeda Informxe~ https://universidadeuropea.es/onlin~ added
# 4 Grado en Derecho a distancia | U~ https://universidadeuropea.es/onlin~ dele~
# 5 "Grado en Criminologxeda a dist~ https://universidadeuropea.es/onlin~ dele~
# 6 "Grado Ingenierxeda Informxe1t~ https://universidadeuropea.es/onlin~ dele~

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

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

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

# # A tibble: 7 x 3
#   programa                          url                                  label
#   <chr>                             <chr>                                <chr>
# 1 "Mxe1ster en Direccixf3n Hotel~ https://universidadeuropea.es/onlin~ chan~
# 2 Carrera de Derecho a distancia |~ https://universidadeuropea.es/onlin~ added
# 3 "Carrera de Criminologxeda a di~ https://universidadeuropea.es/onlin~ added
# 4 "Carrera Ingenierxeda Informxe~ https://universidadeuropea.es/onlin~ added
# 5 Grado en Derecho a distancia | U~ https://universidadeuropea.es/onlin~ dele~
# 6 "Grado en Criminologxeda a dist~ https://universidadeuropea.es/onlin~ dele~
# 7 "Grado Ingenierxeda Informxe1t~ 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)

Есть идеи?

10000