具有独特组合的 R tcrossprod
R tcrossprod with unique combinations
可能有一个 tcrossprod 版本可以实现这一点,但我找不到它。从下面的示例中,如果顺序无关紧要,如何只获取第一次出现组合的行? IE。 (1,2) 对我来说与 (2,1) 相同。
a <- c(1,2,3,4)
b <- c(10,5,4,10)
df<- data.frame(a,b)
melt(tcrossprod(df$b,1/df$b))
> melt(tcrossprod(df$b,1/df$b))
Var1 Var2 value
1 1 1 1.00
2 2 1 0.50
3 3 1 0.40
4 4 1 1.00
5 1 2 2.00
6 2 2 1.00
7 3 2 0.80
8 4 2 2.00
9 1 3 2.50
10 2 3 1.25
11 3 3 1.00
12 4 3 2.50
13 1 4 1.00
14 2 4 0.50
15 3 4 0.40
16 4 4 1.00
有了 m <- melt(tcrossprod(df$b,1/df$b))
,你可以简单地做:
subset(m,X1>X2)
# X1 X2 value
#2 2 1 0.5
#3 3 1 0.4
#4 4 1 1.0
#7 3 2 0.8
#8 4 2 2.0
#12 4 3 2.5
可能有一个 tcrossprod 版本可以实现这一点,但我找不到它。从下面的示例中,如果顺序无关紧要,如何只获取第一次出现组合的行? IE。 (1,2) 对我来说与 (2,1) 相同。
a <- c(1,2,3,4)
b <- c(10,5,4,10)
df<- data.frame(a,b)
melt(tcrossprod(df$b,1/df$b))
> melt(tcrossprod(df$b,1/df$b))
Var1 Var2 value
1 1 1 1.00
2 2 1 0.50
3 3 1 0.40
4 4 1 1.00
5 1 2 2.00
6 2 2 1.00
7 3 2 0.80
8 4 2 2.00
9 1 3 2.50
10 2 3 1.25
11 3 3 1.00
12 4 3 2.50
13 1 4 1.00
14 2 4 0.50
15 3 4 0.40
16 4 4 1.00
有了 m <- melt(tcrossprod(df$b,1/df$b))
,你可以简单地做:
subset(m,X1>X2)
# X1 X2 value
#2 2 1 0.5
#3 3 1 0.4
#4 4 1 1.0
#7 3 2 0.8
#8 4 2 2.0
#12 4 3 2.5