【问题标题】:R: mean pairwise differences in string vectorsR:字符串向量的平均成对差异
【发布时间】:2021-06-24 06:30:49
【问题描述】:

我有一个字符串向量(每个 50 个元素)的大列表(10,000 项)。 这是来自向量的一个小样本:

c("0101000000000000000000000000000000000000000000001000000000000000000000000000000100000000000100000000000000100000000000000000110000000000000000000000", 
"0000000000000000000000000000000010000000000000000000000000110000000000000000000000000001000000000000001000000010000000000000000000000000000000000001", 
"0000000000000000000100010000000010000000000000010000000000100000000000000100000001000001100000000000001000001000000100000000000000000000000000000100")

在每个向量中,我想估计所有成对差异(即每对中不同字符的数量),然后估计平均值。 鉴于列表的规模很大,这样做的成本效益如何? 谢谢!!

编辑-更新

我正在添加一个具有较短向量和预期输出的示例(与我在下面的评论相同):

a=c("0010100101",
    "1001011101",
    "1111111010")

预期结果(成对差异的平均值): 6.666667

非常感谢@Roland 提供基于 Levenshtein 距离的解决方案!

【问题讨论】:

  • 你能给出这个例子的预期输出吗?

标签: r string


【解决方案1】:

你的问题不是很清楚,但你似乎想要一个 Levenshtein 距离:

x = c("0010100101",
    "1001011101",
    "1111111010")

#switch off deletions and insertions:
d <- adist(x, costs = list(ins=Inf, del=Inf, sub=1)) 
#     [,1] [,2] [,3]
#[1,]    0    6    8
#[2,]    6    0    6
#[3,]    8    6    0

mean(d[upper.tri(d)])
#[1] 6.666667

【讨论】:

  • 非常感谢您的回复!我不确定我是否理解“adist”。在我的示例中,对于 a=c("0010100101", "1001011101", "1111111010") ,我认为它没有给出预期的结果(即在我的解决方案中)
  • @tzema 已修复。请将预期结果添加到问题中。
【解决方案2】:

好吧,我意识到小数据样本并没有那么短,所以我用更短的字符串重复这个例子:

a=c("0010100101",
    "1001011101",
    "1111111010")

我想出了这个解决方案:


library(stringdist)

# matrix with no. of pairwise different characters
xx=(1-outer(a,a,"stringsim",method="hamming"))*nchar(a[1])

> xx
     [,1] [,2] [,3]
[1,]    0    6    8
[2,]    6    0    6
[3,]    8    6    0


# mean no. of pairwise differences
xx1=mean(xx[lower.tri(xx,diag = FALSE)])

> xx1
[1] 6.666667

结果很好,但是我不确定这是否是一个理想的解决方案.. (如果“汉明”方法在任何情况下都是正确的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 2019-06-19
    • 1970-01-01
    • 2014-08-10
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多