R:根据单元格位置对矩阵列表中的单元格进行排名

R: Rank cells in a list of matrices based on cell position

我有一个矩阵列表,其中包含 GPS 跟踪动物之间的关联测量值。列表中的一个矩阵是观察到的关联率,其他矩阵是 GPS 跟踪轨迹的随机版本的关联率。例如,我目前有 99 个随机跟踪轨迹的排列,产生了一个包含 99 个动物关联矩阵的列表,加上观察到的关联矩阵。我预计对于属于同一群的动物,观察到的关联率将高于随机关联率。因此,我想确定观察到的比率与每个 dyad(单元格)的随机比率相比的排名。本质上,我正在进行排名置换测试。然而,由于我只真正关心确定观察到的关联数据是否大于随机轨迹关联数据,任何只给出观察到的细胞等级的结果就足够了。

ls <- list(matrix(10:18,3,3), matrix(18:10,3,3))

我见过使用 sapply 可以获取特定单元格的行列。我可以对所有单元格执行以下操作并在结果向量中取最后一个数字以获得列表中该位置的单元格的排名(知道观察到的数据在矩阵列表中的位置,例如最后一个)。

rank(sapply(ls, '[',1,1))

理想的结果是一个矩阵,其形式与列表中的矩阵相同,给出了观察到的数据的等级,尽管欢迎任何类似的解决方案。提前致谢。

可以那样进行,但是有更简洁、更快捷的方法来获得您想要的结果。

这里有一些代码可以让您的 ls 生成具有以下属性的 3x3 矩阵:

  • 如果ls[[1]]中的条目大于ls[[2]]中对应的条目,记录一个1
  • 如果ls[[1]]中的条目小于ls[[2]]中对应的条目,记录一个2
  • 如果条目相等,则记录 1.5
result <- 1 * (ls[[1]] > ls[[2]]) + 2 * (ls[[1]] < ls[[2]]) + 1.5 * (ls[[1]] == ls[[2]])

它是如何工作的:当我们做类似 ls[[1]] > ls[[2]] 的事情时,我们正在撕掉感兴趣的矩阵并直接比较它们。这段代码的结果是一个 T/F 填充矩阵,它被秘密编码为 0/1 矩阵。然后我们可以将它乘以我们想要表示该情况的任何系数。