在两列数据框上使用 adist

using adist on two columns of data frame

我想用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]))

它工作正常,但对于我的原始数据集,通过列号调用它是不切实际的,我如何在这个函数中引用列名?

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

看看矩阵主对角线就知道了

您可以使用 mapply 来解决这个问题,即

mapply(adist, df$A, df$B)
#[1] 2 1

使用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))