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"] <-
是否为此字段分配了新值r
?
adist(products.norm[r, "company"], real.names)
是否在公司名称中查找模式并将其替换为real.names
中的值?
不确定which.min
在这里是如何运作的。
为什么需要head(products.norm)
?
使用lapply
或sapply
?
谢谢大家! 斯蒂芬
答案 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
我没有对分类准确性进行任何测试,但似乎该方法有希望。请注意,它并没有匹配所有这些。