用标准文本替换文本的R代码

时间:2018-06-01 16:57:09

标签: r

R初学者使用以下代码寻求帮助。

real.names <- c("philips", "akzo", "van houten", "unilever")
for(r in 1:dim(products.norm)[1]) {
  products.norm[r, "company"] <- real.names[which.min(adist(products.norm[r, "company"],
                                                            real.names))]
}
head(products.norm)

目标是使用在real.names中表示的正确名称替换公司名称中的不一致和拼写错误。

for(r in 1:dim(products.norm)[1]) {

r是输入变量吗? 1:dim(products.norm)是否将循环设置为数据文件products.norm中的所有记录? [1]的目的是什么?它代表第一列/字段吗?

products.norm[r, "company"] <- 
    real.names[which.min(adist(products.norm[r, "company"], real.names))]

公司是公司名称的领域。 products.norm[r, "company"] <-是否为此字段分配了新值radist(products.norm[r, "company"], real.names)是否在公司名称中查找模式并将其替换为real.names中的值? 不确定which.min在这里是如何运作的。

为什么需要head(products.norm)

使用lapplysapply

可以做得更好吗?

谢谢大家! 斯蒂芬

1 个答案:

答案 0 :(得分:0)

我正在使用新的fuzzyjoin软件包,它可以解决您的问题:

library(fuzzyjoin)
library(magrittr)

首先制作一个包含真实拼写的字典:

my.dictionary <- data_frame(realname=c("philips", "akzo", "van houten", 
      "unilever"), index=1:length(realname))

接下来,生成要与字典正确匹配的单词数据框:

test.names <- c("Phillllips", "Akzo","Van Hoten", 
      "Unilever","noneoftheabove","philips","Unalever", 
      "unilevel","azo","Azoo","Van Houtin","Akso")
test_df <- data_frame(test.names=test.names, index=1:length(test.names))

执行匹配:

> test_df %>% stringdist_inner_join(my.dictionary,by=c(1))
# A tibble: 7 x 4
  test.names index.x realname index.y
  <chr>        <int> <chr>      <int>
1 Akzo             2 akzo           2
2 Unilever         4 unilever       4
3 philips          6 philips        1
4 Unalever         7 unilever       4
5 unilevel         8 unilever       4
6 azo              9 akzo           2
7 Akso            12 akzo           2

我没有对分类准确性进行任何测试,但似乎该方法有希望。请注意,它并没有匹配所有这些。