首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算R中一个向量内的所有成对差

计算R中一个向量内的所有成对差
EN

Stack Overflow用户
提问于 2014-06-20 03:33:27
回答 3查看 16.7K关注 0票数 21

有几篇关于计算向量之间的成对差异的帖子,但我找不到如何计算向量中的所有差异。

假设我有一个向量,v。

代码语言:javascript
复制
v<-c(1:4)

我想生成第二个向量,它是向量中所有成对差的绝对值。类似于:

代码语言:javascript
复制
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个比较的结果:

代码语言:javascript
复制
output<- c(1,2,3,1,2,1)

在R中有一个函数可以做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-20 03:38:52

代码语言:javascript
复制
as.numeric(dist(v))

似乎是可行的;它将v视为列矩阵,并计算行之间的欧几里德距离,在本例中为sqrt((x-y)^2)=abs(x-y)

如果我们在打高尔夫球,那么我会提供c(dist(v)),它是等同的,而且我猜它将是无与伦比的。

@AndreyShabalin提出了一个很好的观点,使用method="manhattan"可能会更有效一些,因为它避免了平方/平方根的东西。

票数 20
EN

Stack Overflow用户

发布于 2014-06-20 03:40:31

我们去打高尔夫球吧

代码语言:javascript
复制
abs(apply(combn(1:4,2), 2, diff))

@Ben,你的是个杀手!

代码语言:javascript
复制
> 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 

谁知道优雅的(可读的/灵活的)代码会这么慢。

票数 15
EN

Stack Overflow用户

发布于 2014-06-20 03:36:42

一种可能的解决方案是:

代码语言:javascript
复制
z = outer(v,v,'-'); 
z[lower.tri(z)];

[1] 1 2 3 1 2 1
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24314878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档