我有5个字符串向量,每个向量有不同数量的元素。然而,在这些向量中有许多元素是常见的。
Ex v1<-c("a","x","y","z")
v2 <-c("b","g","m","r","s","x","z")
v3 <-c("a","m","x","y","z","b","r","g")
v4 <-c("d","h","a","g","s","x")
v5 <-c("a","b","m","x","y","z")
我想计算所有向量之间匹配的百分比,这取决于匹配的元素数量。我不想用元素的顺序来比较它,所以我们必须检查一个向量的每个元素与另一个向量中的每个元素。这里的最大匹配是在v1和v5之间。我们可以说v1和v5具有(8/10)*100=80%,因此我想要百分比高于50%的两个向量的所有集合。
一个简单的实现是比较两个向量的所有组合。然后,您可以使用intersect
来查找公共值的数量。
require(caTools)
comb <- combs(c("v1","v2","v3","v4","v5"), 2)
for (i in 1:nrow(comb)) {
a <- eval(parse(text = comb[i, 1]))
b <- eval(parse(text = comb[i, 2]))
prct <- 2 * length(intersect(a, b)) / (length(a) + length(b))
cat("nMatching between", comb[i, 1], "and", comb[i, 2], "is", prct)
}
(这里prct
是按照我认为您在v1和v5的示例中描述的那样计算的)
注意,您也可以使用两个嵌套的for循环来实现这一点,但我发现combs
更容易使用,以避免重复的组合。
我使用这里和这里的信息来编写下面的函数,只需输入数据帧和列号。
# x = data /// y = number of column in data for string 1 // x = number of column in data for string 2 //
string_matcher <- function(x, y, z) {
data <- x
char.x <- as.matrix(strsplit(as.character(data[,y]), ""))
char.y <- as.matrix(strsplit(as.character(data[,z]), ""))
stored_vector <- as.matrix(sapply(1:nrow(data), function(i) 2 * length(intersect(char.x[[i]], char.y[[i]])) /
(length(char.x[[i]]) + length(char.y[[i]]))))
return(stored_vector)
}