当前位置: 首页 > 知识库问答 >
问题:

为什么all.equal在向量列表中找不到向量?

符俊材
2023-03-14

我正在尝试编写一些代码,以在一个庞大的向量数组中找到一个特定的向量,并返回该向量副本出现的位置的索引。在尝试调试时,我试图学习<code>all的行为。equal(此处推荐,类型不匹配似乎排除了相同的)。我现在编写了以下代码

data<-replicate(100000,sample(4)) 
which( apply(data, 2, function(x) all.equal(c(1:4),data)) == TRUE)

据我了解,我所写的第一行生成了大量从 1 到 4 的整数排列,第二行搜索它们以查找精确排列 1、2、3、4 的任何场合。从统计学上讲,我非常有信心这种排列应该出现在这个列表中的某个地方,在我的特殊情况下,它是第九个条目。但是,每次我运行此代码或其任何变体时,我都被告知所需的排列永远不会出现。

我做错了什么?坦率地说,当我不得不查找如何在向量列表中查找向量并且我必须使用两个函数来执行此操作时,我开始怀疑我犯了一个重大错误。有没有更简单的方法?

共有2个答案

段志
2023-03-14

请尝试以下操作:

which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)

不同之处在于,在您的代码中,您是将名为< code>data的整个结构与1:4进行比较,由于大小不匹配,这将永远不会是< code>TRUE。我在应用的函数中用< code>x替换了< code>data,所以现在每个单独的列都以1:4进行比较。

您的代码中也有一些冗余,c(1:4)1:4相同。在这种情况下,all.equal可能有些多余,因为它所做的不仅仅是比较(它与模糊因子进行比较,并告诉您事物的不同之处)。您使用它的方式是将TRUE转换为字符。不提前简化会更有效率。这是一个快速比较(较小的模拟数据):

> library(microbenchmark)
> 
> microbenchmark(
+   ae = {
+     data<-replicate(100,sample(4)) 
+     which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)
+   },
+   e = {
+     data <- replicate(100, sample(4), simplify=FALSE)
+     which(sapply(data, function(x)all(x==(1:4))))
+   }
+ )
Unit: microseconds
 expr      min        lq      mean    median       uq       max neval cld
   ae 4063.205 4303.3370 4940.2126 4501.5080 4951.623 10953.339   100   b
    e  455.934  493.3115  578.4828  523.4605  562.601  2013.444   100  a 

简化的代码运行时间约为九分之一(平均)。

巢靖
2023-03-14

事实上,你就快到了,只是一个小小的错别字。正确的代码是

which(apply(data, 2, function(x) all.equal(x, c(1, 2, 3, 4))) == TRUE)

因为您需要提供用于比较的数据,而所需的数据是列,而不是整个数据集。按照您的方法,它永远不会找到匹配项,因为整个数组永远不会匹配一个向量。

 类似资料:
  • 问题内容: 假设我有一个形状为(1,256)的行向量。我想将其转换为形状为(256,1)的列向量。您在Numpy中会如何做? 问题答案: 您可以使用 转置 操作来执行此操作: 例: 请注意,原始数组仍将保持不变。转置操作只会复制并转置它。 如果输入阵列是相当1D中,则可以 促进 通过引入新的(singleton)的轴作为所述第二尺寸数组的列向量。下面是一个示例: 对于一维情况,还有另一个选择是使用

  • 我有一个人名向量列表,每个向量只有名字和姓氏,我有另一个向量列表,每个向量有名字的第一个,中间的,姓氏。我需要匹配这两个列表,以找到包含在这两个列表中的人。因为名称不是按顺序排列的(有些向量以名字作为第一个值,而有些向量以姓氏作为第一个值),所以我想通过查找第二个列表中的哪个向量(全名)包含第一个列表中某个向量的所有值(只有名字和姓氏)来匹配这两个向量。 到目前为止我所做的: 首先,我尝试创建一个

  • 问题内容: 我在R向量中有一个ID列表。 我想写一个RODBC sqlQuery并附上一个类似这样的子句 我是否必须读取整个表,然后将其合并到R中的idList向量?或者如何将这些值提供给RODBC语句,以便仅恢复我感兴趣的记录? 注意: 由于列表很长,因此无法将单个值粘贴到SQL语句中,如下面的答案所示。 问题答案: 您可以始终使用以下语句构造语句 显然,您需要为此添加更多内容以构造您的确切语句

  • 我试图创建一个图,它将有V个顶点。我正在使用向量的向量来表示图(作为邻接列表)。我的图中的节点是从0到V-1的编号,所以adj向量的索引代表了节点的数量。除非我搞错了,adj[u]代表一个向量,所以我应该可以使用adj[u].push_back(v)将顶点v推入顶点u的邻接列表中。所以在我的例子中,adj[4]应该得到与节点4相邻的顶点所在的向量,而.push_back(1) 这不会发生的。我想这

  • 本文向大家介绍如何在R中将矩阵列转换为向量列表?,包括了如何在R中将矩阵列转换为向量列表?的使用技巧和注意事项,需要的朋友参考一下 如果要使用矩阵的列作为向量,则可以将它们转换为向量列表。要将矩阵列转换为向量列表,我们首先需要将矩阵转换为数据框,然后才能将其读取为列表。这可以作为as.list(as.data.frame(matrix_name))完成。 示例 考虑下面的矩阵- 将矩阵M列转换为向

  • 我试图在PySpark中使用https://nlp.stanford.edu/projects/GloVe/预先训练的手套模型实现一个简单的Doc2Vec算法。 我有两个RDD:

  • 我有两个大小相等的向量,例如。 我感兴趣的是在两个相同大小的向量A中找到最接近的值(几乎相等) 为了清楚起见,我不想在单个向量中找到最接近的值。上面例子的答案是2.56和2.52。

  • 我想在不同的列表中加入多个向量,并输出一个矩阵列表。其思想是,列表中具有相同名称的所有项目,例如所有项目,通过行作为矩阵连接起来。增加的复杂性是,这些向量可以具有不同的长度,因此实现起来并不简单;矩阵中缺少的值可以附加s。 输入列表: 我希望获得的理想输出是一个列表,其中矩阵的数量与唯一列表项的数量相同,其中每个矩阵由行绑定的不同长度的向量组成: 我将如何编写一个函数,它也可以扩展到合并具有不同长