使用函数stringdist
,我可以计算字符串之间的Levenshtein距离:它计算将字符串转换为另一个字符串所需的删除,插入和替换的次数。例如,stringdist("abc abc","abcd abc") = 1
是因为在第二个字符串中插入了“ d”。
是否可以知道为获取两个琴弦之间的Levenshtein距离而进行的操作?还是要知道两个字符串之间不同的字符(在此示例中,只有“ d”)? 谢谢。
library(stringdist)
stringdist("abc abc","abcde acc") = 3
我想知道:
“ d”
“ e”
“ b”替换为“ c”
或更简单地说,我想获得列表(“ d”,“ e”,“ c”)。
答案 0 :(得分:10)
使用adist()
,您可以检索以下操作:
drop(attr(adist("abc abc","abcde acc", count = TRUE), "counts"))
ins del sub
2 0 1
来自?adist
:
如果counts为TRUE,则转换计数作为 此矩阵的“计数”属性,为3维数组,具有 对应于x元素,y元素和 转换类型(插入,删除和替换), 分别。
答案 1 :(得分:8)
这被称为Needleman–Wunsch algorithm。它可以计算两个字符串之间的距离以及所谓的 traceback ,从而可以重新构造对齐方式。
由于在比较生物学序列时该问题大多出现在生物学中,因此该算法(及相关算法)在R软件包{Biostrings}中实现,该软件包是Bioconductor的一部分。
由于此软件包实现的解决方案比简单的Levenshtein距离更通用,因此使用复杂得多,usage vignette也相应长。但是,您的基本用法如下:
app.controller('testController', function ($scope, $http) {
$http({
method: 'GET',
url: 'https://jsonplaceholder.typicode.com/posts',
}).then(function (response) {
console.log(response.data[0])
$scope.response = response.data[0];
console.log($scope.response)
//alert($scope.response);
});
});
<body ng-app="myApp" class="text-center">
<div id="foo" ng-controller="testController">
{{response.title}}
</div>
...
</body>
但是,这不会简单地为您提供列表Function Check-ADUser($Username){
$Properties = "whatever properties you want"
Get-ADUser $username -Properties * | Select $Properties
}
,因为该列表不能完全代表实际发生的情况。相反,它将在两个字符串之间返回 alignment 。这可以表示为具有替换和空白的序列:
library(Biostrings)
dist_mat = diag(27L)
colnames(dist_mat) = rownames(dist_mat) = c(letters, ' ')
result = pairwiseAlignment(
"abc abc", "abcde acc",
substitutionMatrix = dist_mat,
gapOpening = 1, gapExtension = 1
)
-对于第二个字符串中的每个字符,它提供原始字符串中的相应字符,用c('b', 'c', 'c')
替换插入的字符。基本上,这是将第一个字符串转换为第二个字符串的“食谱”。请注意,它将仅包含插入和替换,不包含删除。要获得这些,您需要以另一种方式进行对齐(即交换字符串参数)。
答案 2 :(得分:7)
根据tmfmnk的答案以及建议使用“ trafos”属性的建议,此函数将向您显示一个表格,其中包含所有插入或替换的字符以及插入和替换的字符数。如果您设置f <- function(x, y, all_actions = FALSE){
o <- adist(x, y, count = TRUE)
cva <-
list(char = strsplit(y, '')[[1]],
action = strsplit(attr(o,"trafos"), '')[[1]])
if(!all_actions)
cva <- lapply(cva, '[', cva$action %in% c('I', 'S'))
do.call(table, cva)
}
f(x = "abc abc", y = "abcde acc")
# action
# char I S
# c 0 1
# d 1 0
# e 1 0
f(x = "abc abc", y = "abcde acc", all_actions = T)
# action
# char I M S
# 0 1 0
# a 0 2 0
# b 0 1 0
# c 0 2 1
# d 1 0 0
# e 1 0 0
,它也会显示您的匹配项。
{{1}}