我有他们的血统有例如很多家长不同基因型转换类似的名字,以数字
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")