我是R的初学者,正在Excel或R中寻求一些帮助。
我有一张excel表格,有两列(全部为文本(。
- 第1列大约有100000行,是一个长名称列表
- 第2列大约有500行,是一个缩短名称的列表
要求:如果第1列中的单元格包含第2列中的任何文本字符串,我需要将第1列的单元格重命名为第2列的字符串。第2列中的所有字符串都是唯一的,所以不应该存在重叠的问题。
我无法在Excel中找到它,因为单元格不完全匹配,Excel的近似匹配太不准确,无法使用。我考虑过用R来做,但列的行数不同,这让我很困惑。非常感谢任何可能的帮助。请让我知道我是否应该包括更多/更多的细节。非常感谢。
这是R格式的一个例子(除了由于行数不同,列是单独的dfs(
Column1 <- data.frame(Full_Name = c("Geico Auto Insurance",
"Geico Motorcycle Insurance",
"Geico Commercial Auto Insurance",
"State Farm Car Insurance",
"State Farm Life Insurance"))
Column2 <- data.frame(Group_Name = c("Geico ",
"State Farm",
"Allstate"))
更多:excel 中的示例
我们可以创建一个正则表达式来捕获'Column2''Group_Name'中的单词
library(dplyr)
library(stringr)
Column1 %>%
mutate(New_Name = str_replace(Full_Name,
str_c(".*(", str_c(Column2$Group_Name, collapse="|"), ").*"), "\1"))
-输出
Full_Name New_Name
1 Geico Auto Insurance Geico
2 Geico Motorcycle Insurance Geico
3 Geico Commercial Auto Insurance Geico
4 State Farm Car Insurance State Farm
5 State Farm Life Insurance State Farm
库(dplyr(库(字符串(
你可以分几个步骤完成:
- 为列2创建矢量
short_name_vct<-唯一(df$GroupName(
- 创建函数
get_match <- function(string) { str_detect(stringr, short_name_vct)[short_name_vct] }
- 然后只使用
dplyr
df%>%mutate(new_col=get_match(full_name((
fuzzyjoin::regex_left_join(Column1, Column2, by = c("Full_Name" = "Group_Name"))
# Full_Name Group_Name
# 1 Geico Auto Insurance Geico
# 2 Geico Motorcycle Insurance Geico
# 3 Geico Commercial Auto Insurance Geico
# 4 State Farm Car Insurance State Farm
# 5 State Farm Life Insurance State Farm
从这里,您可以重命名Group_Name
并使用它。您会发现NA
s中没有正则表达式匹配,因此您可能希望使用dplyr::coalesce
或类似的函数来使用第一个非NA
值。