2017-09-25 62 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")