【问题标题】:How to rearrange rows and column in R如何在R中重新排列行和列
【发布时间】:2014-06-26 15:16:43
【问题描述】:

请帮助重新排列行和列 . 我有两张桌子(垫子和垫子1) 表1是垫子

mat <- matrix("", 5, 7)
mat[c(1),] <- sample(c("AA", "AG", "GG", "--"), 7, TRUE)
mat[c(2),] <- sample(c("AA", "AT", "TT", "--"), 7, TRUE)
mat[c(3),] <- sample(c("CC", "CG", "GG", "--"), 7, TRUE)
mat[c(4,5),] <- sample(c("CC", "CG", "GG", "--"), 7, TRUE)
colnames(mat)= c("Line_1", "Line_2", "Line_3", "Line_4", "Line_5", "Line_6", "Line_7")
row.names(mat)= c("Marker_1", "Marker_2", "Marker_3", "Marker_4", "Marker_5")

表2是mat1

mat1<-matrix(c("1", "1","3","8","10", 2.3, 4.3, 45.5, 102.8, 74.8), nrow = 5)
row.names(mat1)= c("Marker_1", "Marker_2", "Marker_3", "Marker_4", "Marker_5")
colnames(mat1)= c("Linkage_Group", "Map_Position")

我用cbind合并两个表

mat2 <- cbind(mat, mat1)

但是,我需要通过比较每一行来重新排列数据,并使用以下格式的附加比较列来获得结果。如果标记数据匹配,则为“Mono”,如果缺少一个或两个,则为“Mis”,如果不匹配,则为“Poly”

Comparison           Marker  Linkage_Group Map_Position   LineX1  LineX2   Mon/Poly
Line_1/Line_2       "Marker_1"      "1"     "2.3"       "AA"        "--"      Mis
Line_1/Line_3       "Marker_1"      "1"     "2.3"       "AA"        "TT"      Poly
Line_1/Line_4       "Marker_1"      "1"     "2.3"       "AA"        "TT"      Poly
Line_1/Line_5       "Marker_1"      "1"     "2.3"       "AA"        "AT"      Poly
Line_1/Line_6       "Marker_1"      "1"     "2.3"       "AA"        "--"      Mis
Line_1/Line_7       "Marker_1"      "1"     "2.3"       "AA"        "AA"      Mono

.
.
.

上面的例子会有 21 行组合。

这里有很多R大师...请帮助我!

【问题讨论】:

    标签: r sorting combinations


    【解决方案1】:

    检查这是否有帮助:

    列名Line 的组合。 使用grep 查找列名中的模式

    indx <- combn(colnames(mat2)[grep("Line", colnames(mat2))], 2)
    

    将列名 indx 拆分为 indx 的列,这样每个列表元素都是两列的组合

      res <- do.call(rbind, lapply(split(indx, col(indx)), function(x) {
     m1 <- mat2[, c("Linkage_Group", "Map_Position", x)] ##subset mat2 
    #compare the concerned columns rowwise  
    m2 <- cbind(Comparison = paste(x, collapse = "/"), Marker = row.names(m1), m1, 
        `Mon/Poly` = apply(m1[, 3:4], 1, function(x) ifelse(any(grepl('--', x)), "Mis",
     ifelse(x[1] == x[2], "Mono", "Poly"))))
    }))
    

    根据需要订购

    res1 <- res[order(res[,"Marker"], res[,"Linkage_Group"], res[,"Map_Position"]),]
    
    tail(res1,3)
    #       Comparison      Marker     Linkage_Group Map_Position Line_1 Line_2
    # Marker_5 "Line_5/Line_6" "Marker_5" "10"          "74.8"       "--"   "--"  
    # Marker_5 "Line_5/Line_7" "Marker_5" "10"          "74.8"       "--"   "--"  
    # Marker_5 "Line_6/Line_7" "Marker_5" "10"          "74.8"       "--"   "--"  
    #         Mon/Poly
    # Marker_5 "Mis"   
    # Marker_5 "Mis"   
    # Marker_5 "Mis"   
    

    顺便说一句:最好将这些存储在 data.frame 中

    【讨论】:

    • 感谢 akrub !...你拯救了我的一天!
    • akrun:代码中存在一个小问题,因为当两行都有“--”时,它没有正确区分。它应该在最后一列中归类为“Mis”而不是“Mono”
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多