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
中获得 diff
erence:
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)
我有两个数据框。一个数据框标识成对的观察值,其中成对是唯一的,但一个元素可以是多个成对的一部分(见下文)。
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
中获得 diff
erence:
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)