【问题标题】:How many rows meet a condition based on permutation of columns in a matrix有多少行满足基于矩阵中列排列的条件
【发布时间】:2014-11-08 06:21:37
【问题描述】:

我有一个矩阵,其中每一行是一个样本,每一列是一个物种(样本 X 物种矩阵)。我想知道有多少样本(行)具有相同的两个未指定的物种(正值)。例如:

> df <- matrix(c(1,0,10,1,8,1,0,1,0,0,1,0),nrow=4,ncol=3)
> colnames(df) <- letters[1:3]
> df
      a b c
[1,]  1 8 0
[2,]  0 1 0
[3,] 10 0 1
[4,]  1 1 0

在这里,我有 4 个样本,其中记录了物种 a、b 和 c 的丰度。棘手的部分(对我来说)是我不在乎这两个物种是什么。因此,我需要对列的每个 pairwise* 组合进行置换,并让 R 返回每个成对组合一起找到的频率(行数)(以及它们是什么)。第三种是否存在是无关紧要的。在这个例子中,答案是:

a 和 b 在 2 个样本中同时出现。

a 和 c 在 1 个样本中同时出现。

b 和 c 在 0 个样本中同时出现。

对于解决此问题的任何帮助或建议,我将不胜感激。非常感谢!

*我随意使用了2种作为例子。

【问题讨论】:

  • 这和 SQL 有什么关系?
  • 请根据您的示例数据提供所需的结果
  • 提供了所需的结果:a 和 b 在 2 个样本中同时出现。 a 和 c 在 1 个样本中同时出现。 b 和 c 在 0 个样本中同时出现。下面提供了所需的方法。比你。

标签: r matrix


【解决方案1】:

你可以使用combn,像这样:

df <- matrix(c(1,0,10,1,8,1,0,1,0,0,1,0),nrow=4,ncol=3)
colnames(df) <- letters[1:3]
df

combn(colnames(df), 2, FUN = function(x) {
  sum(as.logical(df[, x[1]]) & as.logical(df[, x[2]]))
})
# [1] 2 1 0

姓名:

unlist(combn(colnames(df), 2, FUN = function(x) {
  setNames(sum(as.logical(df[, x[1]]) & as.logical(df[, x[2]])), 
           paste(x, collapse = "_"))
}, simplify = FALSE))
# a_b a_c b_c 
#   2   1   0

【讨论】:

  • 我总是忘记这个功能!
  • 谢谢!这对于两列示例非常有效,如果需要,可以轻松扩展到更多。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
相关资源
最近更新 更多