【发布时间】: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<- 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$Name 与 df2$Name 匹配,忽略标点符号或公司类型的变化,如 corp、inc、ltd、llc 等。有人可以帮我找到一种方法吗?
【问题讨论】:
-
将数据共享为可重现 R 对象而非图像。
-
希望这些变化有所帮助
-
总结一下,你想删除所有的 'INC, INCORP' 对吗?你说的比赛是什么意思?你想结合这两个dfs吗?我们可以这样做:
df2$Name <- gsub( " .*$", "", df2$Name)删除所有这些东西,只留下公司缩写,然后合并两个 dfs:df3 <- 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 工业公司。但我想找到一种方法来忽略标点符号等