比较各组样本对(来自未配对数据)的所有迭代

时间:2018-11-01 14:04:19

标签: r dataframe matching

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

可复制的示例

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

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

我正在为如何解决这个问题而苦苦挣扎,怕我会陷入循环的海洋中。

2 个答案:

答案 0 :(得分:1)

您可以splitvalue分成两个向量,然后调用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))

答案 1 :(得分:1)

这是一个tidyverse解决方案。

请注意,我使用的数据集与您发布的数据集相似,但具有2个类,以便使某些数据更接近您的真实数据集。

# 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))

library(tidyverse)

# create a function to calculate average of ratios
GetAvgRatios = function(d) {

  expand.grid(d$value[d$group == 2],
              d$value[d$group == 1]) %>%
    mutate(v = Var1/Var2) %>%
    pull(v) %>%
    mean() }

# aplly function to the sub-dataset based on each class
play2 %>%
  nest(-class) %>%
  mutate(v = map(data, GetAvgRatios)) %>%
  select(class, v)

#   class        v
# 1   100 3.111111
# 2   200 3.444444