我有他們的血統有例如很多家長不同基因型轉換類似的名字,以數字
genotypes parents
G1 mac cemolt giza
G2 mac miser
G3 misr cemolt mac NE10
我有很多基因型的我想作一個矩陣,其中包括每兩個之間的共同親基因型,所以它應該看起來像
G1 G2 G3
G1 0 1 2
G2 2
我該如何執行此操作?
我有他們的血統有例如很多家長不同基因型轉換類似的名字,以數字
genotypes parents
G1 mac cemolt giza
G2 mac miser
G3 misr cemolt mac NE10
我有很多基因型的我想作一個矩陣,其中包括每兩個之間的共同親基因型,所以它應該看起來像
G1 G2 G3
G1 0 1 2
G2 2
我該如何執行此操作?
下面是一個解決方案,使用可重複的代碼和嵌套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)
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")