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

时间:2016-04-15 10:03:20

标签: 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%。

2 个答案:

答案 0 :(得分:1)

一个简单的实现方法是比较两个向量的所有组合。然后,您可以使用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更容易使用以避免重复组合。

答案 1 :(得分:0)

我使用了此处的信息和HERE来编写以下函数,只需输入数据框和列号。

# 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)
    }