R 将相似的名称转换为数字

R 将相似的名称转换为数字,r,excel,statistics,R,Excel,Statistics,我有不同的基因型,比如他们的家族有很多父母 genotypes parents G1 mac cemolt giza G2 mac miser G3 misr cemolt mac NE10 我有很多基因型,我想制作一个矩阵,其中包括每两个基因型之间的共同父母,所以看起来应该是 G1 G2 G3 G1 0 1 2 G2 2 如何执行此操作?下面是一个使用可复制代码和嵌套SAPPLY的intersect函数的解决方案 geno

我有不同的基因型,比如他们的家族有很多父母

genotypes parents
G1        mac cemolt giza
G2        mac miser
G3        misr cemolt mac NE10
我有很多基因型,我想制作一个矩阵,其中包括每两个基因型之间的共同父母,所以看起来应该是

   G1 G2 G3
G1 0   1  2
G2        2

如何执行此操作?

下面是一个使用可复制代码和嵌套SAPPLY的intersect函数的解决方案

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)
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)))   
        }
    })
}
outer(df$parents, df$parents, FUN = "commonParents")