簡體   English   中英

在 R (VLOOKUP) 中合並兩個數據幀時遇到問題

[英]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)

但沒有想要的結果。 我附上三個文件:

  • Today.csv ,今天抓取的結果
  • Yesterdat.csv ,有昨天抓取的結果
  • Results.xlsx與所需的輸出。 Excel 中的 VLOOKUP,突出顯示我想要檢測的更改(在這種情況下名稱更改)。

我需要四個更改選項的解決方案。 輸出可能不同,我不在乎,但我需要比較正確即使你發現這個問題是重復的,我也需要另一個問題的鏈接,因為我找不到它。

提前致謝。

根據以下評論更新答案:

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相比programurl發生了yest 我們將這些結果傳送到mutate()調用中,並將changed的值分配給label ,如果programa的值與昨天相同( programa %in% yest$programa ),而url值已更改。 如果programa %in% yest$programaFALSE ,則表示該程序名稱不在yest因此它是一個新程序,我們將其標記為added
    • 當我們第二次調用anti_join()時,我們正在尋找yesttoday程序名稱之間的區別。 換句話說:“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM