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

R 跨组比较样本对(来自未配对数据)的所有迭代,r,dataframe,matching,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 10

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

可复制示例

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

play您可以
将列
拆分为两个向量,然后调用
expand.grid
以获取向量之间的所有元素对,然后使用
Reduce
对每一对元素调用
/
,然后取
平均值

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答案中窃取)

#示例数据集

play2这里有一个
tidyverse
解决方案

请注意,我使用的数据集与您发布的数据集类似,但有两个类,以便更接近您的真实数据集

#示例数据集
播放2%
变异(v=Var1/Var2)%>%
拉力(v)%>%
mean()}
#基于每个类将函数应用于子数据集
播放2%>%
嵌套(-class)%>%
变异(v=map(数据,GetAvgRatios))%>%
选择(类别,v)
#第五类
# 1   100 3.111111
# 2   200 3.444444

v1真棒,谢谢!通过这一点,我学到了很多关于tidyverse表示法的知识——仍然不确定我是否理解nest函数,但它确实完成了工作。我必须使用unlist才能将最终输出导出为.csv,因为它给了我一个列“v”的列表。
# 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))
# 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