R 数据框中的成对观察值之间的成对差异

Pairwise Difference Between Pairs of Observations within an R data frame

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

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

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

重塑为长,以便您可以将 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)