首页 > 解决方案 > 跨组比较样本对的所有迭代(来自未配对的数据)

问题描述

我想通过平均它们之间所有可能的数据对的比较来比较两个不同的组。

可重现的例子

play <- data.frame(id = c(1:7), class=rep.int(100,7),group=c(rep.int(1,3),rep.int(2,4)), value=c(2,3,2,8,7,6,7))

  id class group value
  1   100     1     2
  2   100     1     3
  3   100     1     2
  4   100     2     8
  5   100     2     7
  6   100     2     6
  7   100     2     7

所以我有 7 个样本,都来自同一个班级,来自两个不同的组。我想要的是通过单独配对来自第 2 组和第 1 组样本的每个可能的值组合,然后对它们进行平均来计算第 2 组/第 1 组值的总体比率。

所以最终的输出值是8/2, 7/2, 6/2, 7/2, 8/3, 7/3, 6/3, 7/3, 8/2, 7/2, 6的平均值/2, 7/2 = 3.111

在我的完整数据集中,我还有更多的类,我只想在每个类中进行比较。每个类/组中的样本数量会略有不同。

我正在为如何解决这个问题而苦苦挣扎,并且担心我最终会陷入困境。

标签: rdataframematching

解决方案


您可以split将列value分成两个向量,然后调用expand.grid以获取向量之间的所有元素对,然后使用 调用/这些对中的每一对Reduce,然后使用mean.

library(data.table)
library(magrittr)
setDT(play2)

play2[, value %>% 
          split(-group) %>% 
          do.call(what = expand.grid) %>% 
          Reduce(f = `/`) %>% 
          mean
      , by = class]

#    class       V1
# 1:   100 3.111111
# 2:   200 3.444444

使用的数据(从 AntoniosK 答案中窃取)

# example dataset
play2 <- data.frame(id = c(1:14), 
                    class=c(rep.int(100,7), rep.int(200,7)),
                    group=c(rep.int(1,3),rep.int(2,4)), 
                    value=c(2,3,2,8,7,6,7,2,3,2,8,7,6,10))

推荐阅读