将相似的名字转换成数字

我有不同的基因型,他们的血统有很多父母

genotypes parents G1 mac cemolt giza G2 mac miser G3 misr cemolt mac NE10 

我有很多基因型,我想做一个matrix,其中包括每两个基因型之间的共同父母,所以它应该看起来像

  G1 G2 G3 G1 0 1 2 G2 2 

我怎样才能做到这一点?

这是一个解决scheme,使用可重复的代码和嵌套sapplys的相交function。

 genotypes <- c("G1", "G2", "G3") parents <- list(c("mac", "cemolt", "giza"), c("mac", "miser"), c("miser", "cemolt", "mac", "NE10")) comparisons <- sapply(parents, function(x) sapply(parents, function(y) length(intersect(x,y)))) rownames(comparisons) <- genotypes colnames(comparisons) <- genotypes as.dist(comparisons) 

1)生成dataframe:

 df <- data.frame(genotypes = c("G1", "G2", "G3"), parents = c("mac cemolt giza", "mac miser", "miser cemolt mac NE10"), stringsAsFactors = FALSE) 

2)编写函数在基因型string中寻找共同父母。

假设:在父母栏中,每个父母由一个空格分开。 如果基因型与自身进行比较,则返回0个共同父母(根据您的预期结果表)。

 commonParents <- function(vector1, vector2) { lapply(1:length(vector1), function(x) { if(vector1[x] == vector2[x]) { return(0) } else { parents <- unlist(strsplit(vector1[x], split = " ")) sum(sapply(parents, function(y) grepl(y, vector2[x], ignore.case = TRUE))) } }) } 

3)使用outer来创build一个值的matrix:

 outer(df$parents, df$parents, FUN = "commonParents")