Мне нужна помощь в объединении двух фреймов данных с R. Я немного отчаялся, потому что я пробовал все, что мог. Любая помощь будет оценена.
Дело в том, что я делаю некоторые ежедневные проверки в сети, и мне нужно сравнить сегодняшние результаты со вчерашними, чтобы определить, были ли какие-либо изменения.
У меня есть только две переменные (заголовок страницы и URL) в двух фреймах данных (одна на сегодня и одна на вчера), и я хочу объединить их в одну.
Возможные изменения:
Я пробовал слиянием, приведением и расплавлением, ifelse и т. Д. И т. Д., И я не могу решить проблему. Например:
yesterday <- read.csv2("Yesterday.csv")
today <- read.csv2("Today.csv")
new <- merge(x = today, y = yesterday, all = TRUE, sort = TRUE)
Но без желаемого результата. Я прилагаю три файла:
Мне нужно решение для четырех вариантов изменений. Вывод может быть другим, меня это не волнует, но мне нужно, чтобы сравнение было правильным. Даже если бы вы обнаружили, что этот вопрос дублирован, мне нужна ссылка на другой, потому что я не смог найти Это.
Заранее спасибо.
Всего 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)