【问题标题】:R: How to match strings of variable length in dataframe columns with different row numbers?R:如何匹配具有不同行号的数据框列中的可变长度字符串?
【发布时间】:2020-02-18 10:32:14
【问题描述】:

我在 R 中有两个具有不同行数的数据框。 df1 有 2 列,超过 12000 行,df2 有

Name = c("7PR SRO.","7PR","3XL INC","ACME INC","ACME INCORP")
abbr = c("7PR","7PR","3XL","ACME","ACME")
df1<- data.frame(Name, abbr, stringAsFactors=FALSE)

第二个数据框 df2 具有与 df 1 相同的名称列。它只有名称列,但为了匹配行条目,我使用合并函数将它们与 df1 合并。但是我仍然在 abbr 列中得到了大约 100 多行 NA 。示例:

df2&lt;- data.frame(Name = c("7PR S.R.O.", "3XL LLC", "ACME Ltd"), stringAsFactors=FALSE)

df2 的名称列也有类似的公司名称,如 df1,但标点符号可能会发生变化或从“Corp”更改为“Ltd”等。基本上我希望 3XL 作为缩写,无论其名称后面是 LLC 还是 Ltd。我尝试使用 stringdist 函数 stringdist(df2$Name,df1$Name,method ='jw') 但它给出了一个错误,说“更长的对象长度不是更短的对象长度的倍数”。

我需要得到的是 df1$Namedf2$Name 匹配,忽略标点符号或公司类型的变化,如 corp、inc、ltd、llc 等。有人可以帮我找到一种方法吗?

【问题讨论】:

  • 将数据共享为可重现 R 对象而非图像。
  • 希望这些变化有所帮助
  • 总结一下,你想删除所有的 'INC, INCORP' 对吗?你说的比赛是什么意思?你想结合这两个dfs吗?我们可以这样做:df2$Name &lt;- gsub( " .*$", "", df2$Name) 删除所有这些东西,只留下公司缩写,然后合并两个 dfs:df3 &lt;- merge(x=df1, y=df2, by='Name', all = TRUE)
  • @Adamm 1)。是的。删除所有“INC”等是其中的一部分。 2)。通过匹配我的意思是我想将列 df2$Name 匹配到 df1$Name 并相应地匹配正确的缩写。 df1 是一个主df,要从中匹配记录以避免重复输入。 3)。我想添加到 df1 中只有来自 df2 的唯一条目。 4) df2 与 df1 不同。例如。 ACME Inc 可能在 df2 中作为 ACME LLC 或 A.C.M.E 或 ACME 工业公司。但我想找到一种方法来忽略标点符号等

标签: r string dataframe


【解决方案1】:

为将来在 df2 中的匹配/合并创建一个新的 abbr 列对您来说似乎没问题,所以这就是我要做的:

  1. 在 df2 中创建一个新列 df2$abbr,其中公司名称不带标点符号
  2. 使用 df1$Name 作为查找来提取公司名称的缩写
# adding a multiple-word company name
Name = c("7PR SRO.","7PR","3XL INC","ACME INC","ACME INCORP", "ABC Industrial complex LTD")
abbr = c("7PR","7PR","3XL","ACME","ACME", "ABC Industrial complex")

# make data frames
df1<- data.frame(Name, abbr, stringsAsFactors=FALSE)
df2<- data.frame(Name = c("7PR S.R.O.", "3XL LLC", "A.C.M_E Ltd"), stringsAsFactors=FALSE) # added some punctation to ACME

# package needed
library(stringr)

# create new column abbr containing the abbreviations
df2 <- df2 %>%
  mutate(abbr = gsub("[[:punct:]]", "", Name), # get rid of punctuation
         abbr = str_extract(abbr, paste(df1$abbr, collapse = "|"))) # use df1$abbr as lookup

【讨论】:

  • 我不想仅仅合并 dfs。我正在尝试将一个主 df(df1)中的字符串与 df2 中的条目匹配,然后如果 df1 中存在该条目,则自动从 df1 获取缩写。请阅读上面的评论了解更多详情。
  • 我还是没听懂,抱歉...你能发布一个想要的输出吗?
  • 基本上如果df2$name 包含c("ACME Ltd", A.C.M.E","ACME. Inc") 等,它仍然会将公司名称与df1$abbr 中的ACME 匹配。我想要的输出是 ACME。希望对您有所帮助。
  • 编辑了我的答案。希望这会有所帮助-如果仍然不是您想要的,我将删除我的答案。祝您找到解决方案好运!
  • 它适用于带有一个单词后跟公司后缀的公司名称,例如ABC LTD。谢谢。但是对于像“ABC Industrial complex LTD”这样的多个单词名称,我只得到“ABC”。我需要答案是 - 'ABC 工业园区'。是否可以编辑上面的脚本以处理公司名称(如 ABC Industrial Complex LTD)以及较小的字符串(如 ACME Ltd)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多