我有不同的基因型,例如他们的家谱有很多父母
genotypes parents
G1 mac cemolt giza
G2 mac miser
G3 misr cemolt mac NE10
我有很多基因型我想制作一个矩阵,其中包括每两个基因型之间的共同父母,所以看起来应该是
G1 G2 G3
G1 0 1 2
G2 2
我该怎么做?
答案 0 :(得分:1)
这是一个使用可重现的代码和嵌套的sapply用于交叉函数的解决方案。
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 :(得分:0)
1)生成数据框:
df <- data.frame(genotypes = c("G1", "G2", "G3"),
parents = c("mac cemolt giza",
"mac miser",
"miser cemolt mac NE10"),
stringsAsFactors = FALSE)
2)编写函数以在基因型字符串中查找共同父项。
假设:在parent列中,每个父级用空格分隔。如果将基因型与自身进行比较,则返回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")