计算 R 中 group() 内所有观察值之间成对差异的平均值?
Calculate mean of pairwise differences between ALL observations WITHIN group() in R?
我有一个 table 喜欢 :
Fish Group Position
1 1 100
2 1 250
3 1 500
4 2 25
5 2 75
6 2 625
我有成群的鱼以及它们在溪流中的位置。要知道它们平均有多接近,我需要计算组内所有观察值的距离差的平均值。
对于组 1 的鱼,它是:
1-2 distance = 250 - 100 = 150
2-3 distance = 500 - 250 = 250
3-1 distance = 500 - 100 = 400
所以我寻找的平均值是平均值(150 + 250 + 400)
对我来说棘手的事情是找到一种在 tidyverse 哲学中做到这一点的方法!
如果 DF
是您的数据,您可以试试这个。希望对你有帮助:
library(dplyr)
DF %>% group_by(Group) %>% mutate(Diff=c(last(Position)-first(Position),diff(Position)))
# A tibble: 6 x 4
# Groups: Group [2]
Fish Group Position Diff
<int> <int> <int> <int>
1 1 1 100 400
2 2 1 250 150
3 3 1 500 250
4 4 2 25 600
5 5 2 75 50
6 6 2 625 550
只要之前的解决方案只是一个草图,试试这个修改,看看这是否适用于您的原始数据:
#Create list by group
L <- split(DF,DF$Group)
#Create function
compute_d <- function(x)
{
xv <- as.numeric(x$Position)
y <- dist(xv)
return(y)
}
#Apply function
lapply(L,compute_d)
结果:
$`1`
1 2
2 150
3 400 250
$`2`
1 2
2 50
3 600 550
或更多修改(新版本):
#Create list by group
L <- split(DF,DF$Group)
#Create function
compute_d <- function(x)
{
xv <- as.numeric(x$Position)
y <- dist(xv)
avg <- mean(y)
y1 <- as.data.frame(as.matrix(y))
y2 <- cbind(x,y1)
y2$mean <- avg
return(y2)
}
#Apply function
z <- do.call('rbind',lapply(L,compute_d))
rownames(z)<-NULL
Fish Group Position 1 2 3 mean
1 1 1 100 0 150 400 266.6667
2 2 1 250 150 0 250 266.6667
3 3 1 500 400 250 0 266.6667
4 4 2 25 0 50 600 400.0000
5 5 2 75 50 0 550 400.0000
6 6 2 625 600 550 0 400.0000
我有一个 table 喜欢 :
Fish Group Position
1 1 100
2 1 250
3 1 500
4 2 25
5 2 75
6 2 625
我有成群的鱼以及它们在溪流中的位置。要知道它们平均有多接近,我需要计算组内所有观察值的距离差的平均值。
对于组 1 的鱼,它是:
1-2 distance = 250 - 100 = 150
2-3 distance = 500 - 250 = 250
3-1 distance = 500 - 100 = 400
所以我寻找的平均值是平均值(150 + 250 + 400)
对我来说棘手的事情是找到一种在 tidyverse 哲学中做到这一点的方法!
如果 DF
是您的数据,您可以试试这个。希望对你有帮助:
library(dplyr)
DF %>% group_by(Group) %>% mutate(Diff=c(last(Position)-first(Position),diff(Position)))
# A tibble: 6 x 4
# Groups: Group [2]
Fish Group Position Diff
<int> <int> <int> <int>
1 1 1 100 400
2 2 1 250 150
3 3 1 500 250
4 4 2 25 600
5 5 2 75 50
6 6 2 625 550
只要之前的解决方案只是一个草图,试试这个修改,看看这是否适用于您的原始数据:
#Create list by group
L <- split(DF,DF$Group)
#Create function
compute_d <- function(x)
{
xv <- as.numeric(x$Position)
y <- dist(xv)
return(y)
}
#Apply function
lapply(L,compute_d)
结果:
$`1`
1 2
2 150
3 400 250
$`2`
1 2
2 50
3 600 550
或更多修改(新版本):
#Create list by group
L <- split(DF,DF$Group)
#Create function
compute_d <- function(x)
{
xv <- as.numeric(x$Position)
y <- dist(xv)
avg <- mean(y)
y1 <- as.data.frame(as.matrix(y))
y2 <- cbind(x,y1)
y2$mean <- avg
return(y2)
}
#Apply function
z <- do.call('rbind',lapply(L,compute_d))
rownames(z)<-NULL
Fish Group Position 1 2 3 mean
1 1 1 100 0 150 400 266.6667
2 2 1 250 150 0 250 266.6667
3 3 1 500 400 250 0 266.6667
4 4 2 25 0 50 600 400.0000
5 5 2 75 50 0 550 400.0000
6 6 2 625 600 550 0 400.0000