这有效(也许除了订单)
firstdf <- data.frame(x = c( 1, 2, 4, 5),
y1 = c(43,51,57,49), y2 = c(55,53,47,44))
co <- combn(firstdf$x,2)
seconddf <- data.frame(xi = c(co[1,], co[2,]), xj = c(co[2,], co[1,]))
thirddf <- merge(merge(seconddf, firstdf, by.x = "xj", by.y = "x" ),
firstdf, by.x = "xi", by.y = "x", suffixes = c("j", "i") )
生产
> thirddf
xi xj y1j y2j y1i y2i
1 1 2 51 53 43 55
2 1 5 49 44 43 55
3 1 4 57 47 43 55
4 2 4 57 47 51 53
5 2 1 43 55 51 53
6 2 5 49 44 51 53
7 4 5 49 44 57 47
8 4 1 43 55 57 47
9 4 2 51 53 57 47
10 5 1 43 55 49 44
11 5 2 51 53 49 44
12 5 4 57 47 49 44
其中第一行和第五行与您的示例匹配。
如果你接受firstdf
并坚持一条线,那么你可以把它变成
merge(merge(data.frame(xi = c(combn(firstdf$x,2)[1,], combn(firstdf$x,2)[2,]), xj = c(combn(firstdf$x,2)[2,], combn(firstdf$x,2)[1,])), firstdf, by.x = "xj", by.y = "x" ), firstdf, by.x = "xi", by.y = "x", suffixes = c("j", "i") )
但我真的不明白这一点