在两列数据框上使用adist

时间:2017-12-29 09:15:47

标签: r levenshtein-distance

我想使用adist来计算每行中两列值之间的编辑距离。

我以这种方式或多或少地使用它:

A <- c("mad","car")
B <- c("mug","cat")
my_df <- data.frame(A,B)
my_df$dist <- adist(my_df$A, my_df$B, ignore.case = TRUE)
my_df <- my_df[order(dist),]

最后两行与我的情况相同,但实际数据框看起来有点不同 - 原始数据框的列是字符类型,而不是因子。此外,dist列似乎返回为2列矩阵,我不知道它为什么会发生。

更新: 我读了一下,发现我需要在行上应用它,所以我的新代码如下:

apply(my_df, 1, function(d) adist(d[1], d[2]))

它运行正常,但是对于我的原始数据集,按列号调用它是不切实际的,如何在此函数中引用列名?

3 个答案:

答案 0 :(得分:3)

使用tidyverse方法,您可以使用以下代码:

library(tidyverse)
A <- c("mad","car")
B <- c("mug","cat")
my_df <- data.frame(A,B)

my_df %>% 
    rowwise() %>% 
    mutate(Lev_dist=adist(x=A,y=B,ignore.case=TRUE))

答案 1 :(得分:1)

根据adist函数定义,xy参数应该是字符向量。在你的例子中,函数返回一个2x2矩阵,因为它还将交叉词“mad”与“cat”和“car”与“mug”进行比较。

只需看看矩阵主对角线。

答案 2 :(得分:1)

您可以使用data={"name":"xyz","age":12} year=2017 month=10 class TestModel(models.Model): year = models.IntegerField() month = models.IntegerField() customer = "In this feild i want to store above dictonary" 来解决这个问题,即

EmbeddedDictField