【问题标题】:Calculate mean of pairwise differences between ALL observations WITHIN group() in R?计算R中组()内所有观察值之间的成对差异的平均值?
【发布时间】:2020-06-15 13:16:09
【问题描述】:

我有一张这样的桌子:

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

所以我寻找的平均值是 mean(150 + 250 + 400)

对我来说棘手的事情是在 tidyverse 哲学中找到一种方法!

【问题讨论】:

    标签: r distance tidyr


    【解决方案1】:

    如果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
    

    【讨论】:

    • 嗨!谢谢你的建议。不幸的是,如果组有超过 3 个观察值,这不会计算所有成对比较!我的一些小组有 20 个观察结果。修改方法的任何想法? :)
    • @Nonopov 我添加了一种新方法。希望这能有所帮助。
    • 太棒了!这真的很有帮助,非常感谢您的时间@Duck :) 知道如何将每个矩阵的平均值提取到具有组标识符的列中吗?我现在正在看,如果有什么我会发布的!
    • @Nonopov 我已经用你想要的平均值更新了函数。希望这会有所帮助。
    • 谢谢! @Duck,因为组的大小不同,所以 do.call('rbind') 不起作用,所以我将行更改为: mean_pairwise_distances % select(mean) %>% distinct(mean)))
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多