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"))
我有两个数据框,第一个包含大约 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"))