【问题标题】:Filling a matrix based on the content of another matrix in R根据R中另一个矩阵的内容填充矩阵
【发布时间】:2021-05-26 18:52:13
【问题描述】:

我想根据另一个矩阵的内容填充一个矩阵。以下是矩阵:

set.seed(135)
MAT1 <- replicate(6, sample(c("00", "01", "10", "11", "10"))); MAT1 <- t(MAT1)
rownames(MAT1) <- rep(letters[1:3], each = 2)
MAT1

  [,1] [,2] [,3] [,4] [,5]
a "00" "01" "10" "11" "10"
a "10" "00" "01" "11" "10"
b "10" "10" "00" "11" "01"
b "11" "10" "01" "00" "10"
c "10" "00" "01" "10" "11"
c "00" "10" "11" "01" "10"

LIST <- apply(X = MAT1, MARGIN = 2, FUN = unique)
MAT2 <- matrix(data = NA, nrow = 3, ncol = length(unlist(LIST)))
rownames(MAT2) <- c(letters[1:3]); colnames(MAT2) <- unlist(LIST)
MAT2 <- rbind(Hap = rep(1:length(LIST), lengths(LIST)), MAT2)
MAT2

    1  1  1  2  2  2  3  3  3  3  4  4  4  4  5  5  5
Hap 00 10 11 01 00 10 10 01 00 11 11 00 10 01 10 01 11
a   NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
b   NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
c   NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

MAT2 (MAT2[1,]) 的第一行 (Hap) 包含 MAT1 的每一列的模态,但删除了重复的模态。在colnames(MAT2) 中,1 1 1 表示 MAT1 的第 1 列有三种独特的模态,2 2 2 表示 MAT1 的第 2 列有三种独特的模态,以此类推。 由于 MAT1,我想填充 MAT2,以便对于给定的 Hap 和 colnames,它根据 Hap 在MAT1 中出现的次数填充 0、1 或 2。 以下是预期的MAT2

        1  1  1  2  2  2  3  3  3  3  4  4  4  4  5  5  5
    Hap 00 10 11 01 00 10 10 01 00 11 11 00 10 01 10 01 11
    a   1  1  0  1  1  0  1  1  0  0  2  0  0  0  2  0  0
    b   0  1  1  0  0  2  0  1  1  0  1  1  0  0  1  1  0
    c   1  1  0  0  1  1  0  1  0  1  0  0  1  1  1  0  1

【问题讨论】:

    标签: r


    【解决方案1】:

    我们按列拆分“MAT1”,循环遍历list,在stacking 之后得到计数的table 到一个两列数据集。然后循环遍历listnames 并分配'MAT2' 中与提取的list 元素具有相同名称的列

    lst1 <- lapply(asplit(MAT1, 2), function(x) as.data.frame.matrix(table(stack(x)[2:1])))
    names(lst1) <- seq_along(lst1)
    for(nm in names(lst1)) {
          MAT2[-1, colnames(MAT2) == nm] <- as.matrix(lst1[[nm]])
     }
    

    -输出

    MAT2
    #     1    1    1    2    2    2    3    3    3    4    4    4    4    5    5    5    5   
    #Hap "00" "10" "11" "10" "11" "01" "10" "00" "01" "11" "01" "10" "00" "01" "10" "11" "00"
    #a   "1"  "1"  "0"  "0"  "1"  "1"  "1"  "0"  "1"  "0"  "1"  "0"  "1"  "0"  "1"  "1"  "0" 
    #b   "1"  "0"  "1"  "0"  "2"  "0"  "0"  "2"  "0"  "0"  "0"  "2"  "0"  "1"  "0"  "0"  "1" 
    #c   "0"  "1"  "1"  "1"  "1"  "0"  "0"  "1"  "1"  "1"  "0"  "1"  "0"  "1"  "0"  "0"  "1" 
    

    数据

    MAT1 <- structure(c("00", "10", "00", "11", "10", "11", "10", "11", "10", 
    "10", "10", "01", "10", "00", "01", "01", "01", "10", "11", "01", 
    "10", "10", "00", "10", "01", "10", "11", "00", "11", "00"), .Dim = 6:5,
    .Dimnames = list(
        c("a", "a", "b", "b", "c", "c"), NULL))
    
    MAT2 <- structure(c("00", NA, NA, NA, "10", NA, NA, NA, "11", NA, NA, 
    NA, "10", NA, NA, NA, "11", NA, NA, NA, "01", NA, NA, NA, "10", 
    NA, NA, NA, "00", NA, NA, NA, "01", NA, NA, NA, "11", NA, NA, 
    NA, "01", NA, NA, NA, "10", NA, NA, NA, "00", NA, NA, NA, "01", 
    NA, NA, NA, "10", NA, NA, NA, "11", NA, NA, NA, "00", NA, NA, 
    NA), .Dim = c(4L, 17L), .Dimnames = list(c("Hap", "a", "b", "c"
    ), c("1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "4", 
    "4", "5", "5", "5", "5")))
    

    【讨论】:

    • 在循环之前,它运行良好。但是,循环不会按照基于lst1 的预期填充MAT2lst1 的第二个(甚至是其他)列表未正确填写 MAT2 @akrun。
    • 感谢您的回答,我找到了获得MAT2的方法。这有点糟糕,但它有效。 MAT2 &lt;- do.call(cbind, lst1); COLNAMES &lt;- unlist(lapply(lst1, function(x) colnames(x))); MAT2 &lt;- rbind(Hap = COLNAMES, MAT2); colnames(MAT2) &lt;- rep(1:length(LIST), lengths(LIST))
    • @AchilleNyouma 你的结构可能不同
    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多