[英]Trouble merging two dataframes in R (VLOOKUP)
我需要幫助將兩個數據框與 R 合並。我有點絕望,因為我已經盡我所能了。 任何幫助,將不勝感激。
問題是我每天都在做一些網絡抓取,我需要將今天的結果與昨天的結果進行比較,以檢測是否有任何變化。
我在兩個數據框中只有兩個變量(頁面標題和 url)(一個用於今天,一個用於昨天),我想將它們合並為一個。
可能的變化是:
我嘗試過合並、鑄造和熔化、ifelse 等,但我無法解決問題。 例如:
yesterday <- read.csv2("Yesterday.csv")
today <- read.csv2("Today.csv")
new <- merge(x = today, y = yesterday, all = TRUE, sort = TRUE)
但沒有想要的結果。 我附上三個文件:
我需要四個更改選項的解決方案。 輸出可能不同,我不在乎,但我需要比較正確即使你發現這個問題是重復的,我也需要另一個問題的鏈接,因為我找不到它。
提前致謝。
根據以下評論更新答案:
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()
所有內容都被合並到單個 tibble 中。 就我們這里有兩個單獨的anti_join()
語句而言,它們每個都返回它自己的 tibble,我們必須將它們rbind
到一個;anti_join()
是一個集合操作,它給出兩個集合 A 和 B,返回另一個集合 C,它是 A 的子集但不是 B 的子集。換句話說,C 是 A 和 B 之間的差。
anti_join(today, yest)
我們獲得了today
一個子集,其中的記錄要么根本不存在於yest
中,要么與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
不存在?” 我們通過使用不在today
程序名稱中的程序名稱查找yest
子集來實現這一點(這就是您需要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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.