有几个关于计算向量之间成对差异的帖子,但我找不到如何计算向量中的所有差异。
说我有一个矢量,v。
v<-c(1:4)
我想生成第二个向量,它是向量中所有成对差异的绝对值。类似于:
abs(1-2) = 1
abs(1-3) = 2
abs(1-4) = 3
abs(2-3) = 1
abs(2-4) = 2
abs(3-4) = 1
输出将是6个值的向量,这是我的6次比较的结果:
output<- c(1,2,3,1,2,1)
R中是否有可以执行此操作的功能?
答案 0 :(得分:17)
as.numeric(dist(v))
似乎有效;它将v
视为列矩阵并计算行之间的欧几里德距离,在本例中为sqrt((x-y)^2)=abs(x-y)
如果我们正在打高尔夫球,那么我会提供c(dist(v))
,这是相同的,而我猜测它将是无与伦比的。
method="manhattan"
可能会稍微提高效率,因为它避免了平方/正方形的东西。
答案 1 :(得分:14)
让我们打高尔夫球
abs(apply(combn(1:4,2), 2, diff))
@Ben,你的杀手锏!
> system.time(apply(combn(1:1000,2), 2, diff))
user system elapsed
6.65 0.00 6.67
> system.time(c(dist(1:1000)))
user system elapsed
0.02 0.00 0.01
> system.time({
+ v <- 1:1000
+ z = outer(v,v,'-');
+ z[lower.tri(z)];
+ })
user system elapsed
0.03 0.00 0.03
谁知道优雅(易懂易懂/灵活)的代码可能会很慢。
答案 2 :(得分:12)
可能的解决方案是:
z = outer(v,v,'-');
z[lower.tri(z)];
[1] 1 2 3 1 2 1