【问题标题】:Partial string merge between 2 large datasets on RR上2个大型数据集之间的部分字符串合并
【发布时间】:2021-09-27 11:46:30
【问题描述】:

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

ID COMPANY
AD8.OSZ.23490 Company1
AD8.OSZ.18903 Company2
AD8.OSZ.90126 Company3

第二个包含大约 13 万个观测值和 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 Company
desr-j50q02-AD8.OSZ.23490 1981 Company1
desr-j50q02-AD8.OSZ.18903 2003 Company2
desr-j50q02-AD8.OSZ.90126 2018 Company3

我为左连接尝试了 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)

错误:内存向量已用尽(达到限制?)

我认为这段代码对于我拥有的数据集来说太弱了/不适合我的 MacbookAir。我做了在这里找到的操作:R on MacOS Error: vector memory exhausted (limit reached?) 但它没有改变任何东西。

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

我也看过那个话题:Partial string merge R large dataset,但和我的情况并不完全相同。

【问题讨论】:

    标签: r string dataframe merge text-mining


    【解决方案1】:

    还有另一种思考方式,从您共享的示例中,您总是在最后一个时期之后寻找 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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多