【问题标题】:Calculating the percentage of matching elements between several vectors in R计算R中几个向量之间匹配元素的百分比
【发布时间】:2016-04-15 10:03:20
【问题描述】:

我有 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%。

【问题讨论】:

  • 不应该 v1,v5 为 40%,因为匹配是 a,x,y,z 和 a,b,m,x,y 中的 a,x,y,z (4) ,z (4 + 6 = 10) ?
  • 我不太担心用于计算匹配的指标。我使用了 (4*2)/10,因为我认为它可以给我一个合理的值。
  • 是的 v2 和 v3 有 93.3% 的匹配。对不起,我错过了。
  • v2 和 v3 提供 (6*2)/15 个匹配项。如果使用相同的公式计算,则等于 80%。

标签: r


【解决方案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 更易于使用以避免重复组合。

【讨论】:

  • 能否请您帮我修改此代码中所需的内容,以便代码可以与包含一组单词(例如“the iron metal”)而不是单个字符(例如“a”)的向量一起使用”。再次,我们要寻找“铁金属”的完全匹配。我对使用字符串不太熟悉,我无法在这里弄清楚 parse 和 eval 的作用。
  • 除非我误解了您的示例,否则我认为该代码对于长字符串和单字母应该同样适用。 parseeval 的作用在此处的字符串比较过程中并不重要——真正重要的函数是 intersect(a, b),它适用于任何类型的向量。
  • 如果你的意思是将“铁金属”分离成一个包含“the”、“iron”和“metal”的向量,那么可以使用strsplit("the iron metal", split = " ")
【解决方案2】:

我使用这里的信息和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)
    }

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2014-01-29
    • 2023-03-17
    相关资源
    最近更新 更多