计算R中几个向量之间匹配元素的百分比



我有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)
    }

最新更新