我有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%。
答案 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)
}