R 上 2 个大型数据集之间的部分字符串合并

Partial string merge between 2 large datasets on R

我有两个数据框,第一个包含大约 900K 个观察值和 2 列:

ID 公司
AD8.OSZ.23490 公司 1
AD8.OSZ.18903 公司2
AD8.OSZ.90126 公司 3

第二个包含大约 130k 个观察值和 2 列,但 ID 格式不同(但并非所有观察值都采用相同的形式,对于某些观察值,例如 AD8.OSZ。)。

ID Client_Since
desr-j50q02-AD8.OSZ.23490 1981
desr-j50q02-AD8.OSZ.18903 2003
desr-j50q02-AD8.OSZ.90126 2018

期望输出

Full_ID Client_Since 公司
desr-j50q02-AD8.OSZ.23490 1981 公司 1
desr-j50q02-AD8.OSZ.18903 2003 公司2
desr-j50q02-AD8.OSZ.90126 2018 公司 3

我为左连接尝试了 2 个代码(我想保留所有 130k obs):

#1st 

library(fuzzyjoin)

df3 <- df %>% regex_left_join(df2, by = c(Full_ID = "ID"))

#2nd code

library(stringr)

df3 <- df %>% fuzzy_left_join(df2, by = c("Full_ID" = "ID"), match_fun = str_detect)

Error : memory vectors exhausted (limit reached ?)

我认为这段代码对于我拥有的数据集来说太弱了/不适合我的 MacbookAir。我做了这里的操作: 但它没有改变任何东西。

我读到关于“并行化”使用 R (https://datasquad.at.sites.carleton.edu/data/storage-design/dealing-with-a-vector-memory-exhausted-error-in-r/) 的内容,但我真的不明白如何将 mclapply 与我的连接命令一起使用。

我也看过那个话题:但是跟我的情况不完全一样。

还有另一种思考方式,从您共享的示例中,您总是在最后一个句点之后寻找 ID,因此您可以在最后一个句点之后创建一个包含文本的新列并使用它加入。

下面是如何做到这一点的示例;

# Reading required libraries
library(dplyr)
library(stringr)

# Create sample dataframes
df1 <-
  data.frame(ID = c("AD8.OSZ.23490", "AD8.OSZ.18903", "AD8.OSZ.90126"),
             COMPANY = c("Company1", "Company2", "Company3"))

df2 <-
  data.frame(ID = c("desr-j50q02-AD8.OSZ.23490", "desr-j50q02-AD8.OSZ.18903", "desr-j50q02-AD8.OSZ.90126"),
             Client_Since = c("1981", "2003", "2018"))

# Modify first dataframe
mod_df1 <-
  df1 %>%
  # Get characters after last period
  mutate(MOD_ID = sub('.*\.', '', ID))

# Modify second dataframe
mod_df2 <-
  df2 %>%
  # Get characters after last period
  mutate(MOD_ID = sub('.*\.', '', ID))

# Join tables
mod_df1 %>%
  left_join(mod_df2, by = c("MOD_ID"))