【问题标题】:Pairwise Difference Between Pairs of Observations within an R data frameR数据帧内成对观察之间的成对差异
【发布时间】:2021-12-23 14:53:54
【问题描述】:

我有两个数据框。一个数据框可识别成对的观察结果,其中成对是唯一的,但一个元素可以是多对的一部分(见下文)。

PairID  PairElement1      PairElement2
1       A                 B
2       C                 D
3       E                 F
4       A                 C
5       B                 D
6       G                 H

第二个数据框包含关于组成对的元素的数据(见下文)。

PairElement    var1     var2    var3    var4
A               8        4       3       8
B               8        8       7       6
C               10       1       0       1
D               1        2       3       10
E               10       10      6       4
F               5        6       8       6
G               1        2       6       5
H               8        0       9       0

我的目标是计算每个变量的成对差异,以便对于每一对,观察值代表第一对和第二对元素之间的差异(见下文)。

PairID  Pair1   Pair2   var1d   var2d   var3d   var4d
1       A       B       0        -4     -4      2
2       C       D       9        -1     -3      -9
3       E       F       5        4      -2      -2
4       A       C       -2       3       3      7
5       B       D       7        6       4      -4
6       G       H       -7       2      -3      5

我尝试将两者合并或按对元素拆分数据框,但我想不出一个始终如一的解决方案。

【问题讨论】:

    标签: r dataframe dplyr tuples tidyverse


    【解决方案1】:

    重新整形为 long 以便您可以在 PairElement 上合并为单个列,进行合并,反向排序,在每个 PairID 中获取 difference:

    tmp <- merge(
      reshape(one, idvar="PairID", sep="", varying=-1, direction="long"),
      two,
      by = "PairElement"
    )
    tmp <- tmp[order(tmp$PairID, -tmp$time),]
    aggregate(cbind(var1,var2,var3,var4) ~ PairID, data = tmp, FUN=diff)
    
    #  PairID var1 var2 var3 var4
    #1      1    0   -4   -4    2
    #2      2    9   -1   -3   -9
    #3      3    5    4   -2   -2
    #4      4   -2    3    3    7
    #5      5    7    6    4   -4
    #6      6   -7    2   -3    5
    

    dplyr/tidyr 中,类似于:

    library(dplyr)
    library(tidyr)
    
    one %>%
      pivot_longer(-PairID, values_to="PairElement") %>%
      right_join(two, by="PairElement") %>%
      group_by(PairID) %>%
      arrange(desc(name)) %>%
      select(-name, -PairElement) %>% 
      summarise_all(diff)
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      相关资源
      最近更新 更多