0

假设公司名称的字符向量以各种形式出现。这是一个10,000行数据框的小版本;它显示了所需的第二个向量(“two.names”)。

structure(list(firm = structure(1:8, .Label = c("Carlson Caspers", 
"Carlson Caspers Lindquist & Schuman P.A", "Carlson Caspers Vandenburgh  Lindquist & Schuman P.A.", 
"Carlson Caspers Vandenburgh & Lindquist", "Carmody Torrance", 
"Carmody Torrance et al", "Carmody Torrance Sandak", "Carmody Torrance Sandak & Hennessey LLP"
), class = "factor"), two.name = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Carlson Caspers", "Carmody Torrance"
), class = "factor")), .Names = c("firm", "two.name"), row.names = c(NA, 
-8L), class = "data.frame")


                                               firm         two.name
1                                       Carlson Caspers  Carlson Caspers
2               Carlson Caspers Lindquist & Schuman P.A  Carlson Caspers
3 Carlson Caspers Vandenburgh  Lindquist & Schuman P.A.  Carlson Caspers
4               Carlson Caspers Vandenburgh & Lindquist  Carlson Caspers
5                                      Carmody Torrance Carmody Torrance
6                                Carmody Torrance et al Carmody Torrance
7                               Carmody Torrance Sandak Carmody Torrance
8               Carmody Torrance Sandak & Hennessey LLP Carmody Torrance

假设向量已按公司名称的字母顺序排序(我相信将最短的版本放在首位)。我如何使用agrep()从第一个公司名称开始,将其与第二个公司名称相匹配,然后 - 假设紧密匹配 - 将第一个公司名称添加到新列 (short.name) 中。然后,将其与第三个元素匹配,等等。所有 Carlson 变体都将匹配。

如果没有足够的匹配,比如当 R 遇到第一个 Carmody 时,从它开始并匹配到下一个元素,依此类推,直到下一个不匹配。

如果连续的公司之间没有匹配,R 应该继续直到找到匹配。

这个问题的答案是对整个向量和按年份分组的模糊匹配。 通过名称的模糊匹配(通过使用 R 的 agrep)创建唯一 ID 然而,似乎提供了可以解决我的问题的部分代码。本题使用stringdist(). 字符串列表

编辑:

下面,该对象matches是一个显示匹配项的列表,但我不知道告诉 R 的代码“获取第一个并将以下匹配项(如果有)转换为该名称并将该名称放入新变量列中。 "

as.factor(df$firm)
matches <- lapply(levels(df$firm), agrep, x=levels(df$firm), fixed=TRUE, value=FALSE)
4

1 回答 1

0

我在 for 循环中将其写出来,首先将第一行定义为 short.name,然后找到匹配项,更新数据框并选择下一个要查找的内容。这就是我所说的“不要试图用单线解决这个问题”的意思——你必须首先让它以一种更详细的方式工作,这样你才能理解发生了什么。然后并且仅当您需要时,您可以尝试将其压缩成一个单行。

firm.txt <- as.character(df$firm)
short.name <- firm.txt[1]
for (i in 2:length(firm.txt)) {
  # i don't know how to write it any prettier
  match <- agrep(short.name, firm.txt)
  if (length(match) > 0) {
    df$two.name[match] <- short.name
    i <- max(match) + 1
    short.name <- firm.txt[i]
  }
}
于 2015-01-22T09:59:27.747 回答