2017-09-25 43 views
0

我有他们的血统有例如很多家长不同基因型转换类似的名字,以数字

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

我有很多基因型的我想作一个矩阵,其中包括每两个之间的共同亲基因型,所以它应该看起来像

G1 G2 G3 
G1 0 1 2 
G2  2 

我该如何执行此操作?

回答

1

下面是一个解决方案,使用可重复的代码和嵌套sapplys交叉函数。

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) 
0

1)生成的数据帧:

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

2)写入功能,基因型字符串中找到共同的父母。

假设:在父母栏中,每个父母由一个空格分隔。如果基因型与自身进行比较,则返回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创建的值的矩阵:

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