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