将类似名称转换为数字

时间:2017-09-25 21:50:59

标签: 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

我该怎么做?

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")