我想通过平均两组之间所有可能数据对的比较来比较两组。
可复制的示例
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
在我的完整数据集中,我还有更多的类,并且我只想在每个类中进行比较。每个班级/组的样本数量会略有不同。
我正在为如何解决这个问题而苦苦挣扎,怕我会陷入循环的海洋中。
答案 0 :(得分:1)
您可以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))
答案 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