【问题标题】:calculate union of matrix in r计算r中矩阵的并集
【发布时间】:2021-08-05 21:01:53
【问题描述】:

我有这个 df,我将它转换成一个完整的矩阵。 df.wide 中的 1 表示缺失数据,0 表示实验中没有缺失数据。

df <- data.frame(N_ID = c("1:36","1:66","1:36","1:66","1:87","1:30","1:36","1:88","1:66","1:36"), sample = c("sample1","sample1","sample2","sample2","sample2","sample42","sample42","sample92","sample95","sample30"), n = c(1,1,1,1,1,1,1,1,1,1))

df.wide <- stats::xtabs(n ~ ., df)

现在我想得到一个矩阵,它是样本 x 样本,其中对角线元素等于 df.wide 中每一列的总和,也就是每个个体中缺失观察的数量,非对角线元素等于并集的总和每对样本之间的缺失数据。因此,在结果矩阵中,我希望 sample1 的单元格为 2,sample2 的单元格为 3,sample2 的单元格为 3。sample1、sample2 的单元格将等于 3,因为在 3 个唯一的 N_ID 处缺少这些数据两个样品。也就是说,对于每一对样本,0,0 应该算 0; 0,1 应计为 1; 1,0 应计为 1;并且 1,1 也应该算作 1。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    你是这个意思吗?

    `dimnames<-`(outer(
      1:ncol(df.wide),
      1:ncol(df.wide),
      Vectorize(function(p, q) sum(pmax(df.wide[, p],df.wide[,q])))
    ), rep(list(colnames(df.wide)), 2))
    

    给了

             sample1 sample2 sample30 sample42 sample92 sample95
    sample1        2       3        2        3        3        2
    sample2        3       3        3        4        4        3
    sample30       2       3        1        2        2        2
    sample42       3       4        2        2        3        3
    sample92       3       4        2        3        1        2
    sample95       2       3        2        3        2        1
    

    【讨论】:

    • 不,我不这么认为。如上所述,样本 1、样本 2 的单元格应该是 3 - 因为样本 1 或样本 2 或两者都缺少 3 个 N_ID。
    • 上面的对角线是正确的,但非对角线是不正确的——因为它只是计算样本对(1,1)的次数。它需要统计样本对为(1,0)、(0,1)、(1,1)的次数。或者,样本 i 和样本 j 不都是 0 的次数。
    • @rt11 对不起,我的错。我误解了你的目标。您可以查看我的更新。
    【解决方案2】:

    试试这个:

    library(tidyverse)
    df <- data.frame(N_ID = c("1:36","1:66","1:36","1:66","1:87","1:30","1:36","1:88","1:66","1:36"), sample = c("sample1","sample1","sample2","sample2","sample2","sample42","sample42","sample92","sample95","sample30"), n = c(1,1,1,1,1,1,1,1,1,1))
    
    dff <- df %>% 
      spread(key = sample, value = n, fill = 0)
    
    
    matt <- matrix(0, ncol = ncol(dff) - 1, nrow = ncol(dff) - 1) # initiate a matrix
    
    for(i in 1:nrow(matt)){
      for(j in 1:ncol(matt)){
        matt[i, j] <- sum((dff[, -1][i] + dff[, -1][j]) > 0)
      }
    }
    
    diag(matt) <- sapply(dff[, -1], function(x) sum(as.numeric(x)))
    colnames(matt) <- names(dff)[-1]
    rownames(matt) <- names(dff)[-1]
    
    matt
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多