在R中,为了举例,我有一个由等长数字向量组成的列表,形式类似于:
list <- list(c(1,2,3),c(1,3,2),c(2,1,3))
[[1]]
[1] 1 2 3
[[2]]
[1] 1 3 2
[[3]]
[1] 2 1 3
...
列表中的每个元素都是唯一的。我想获取元素x <- c(2,1,3)
的索引号,或列表中的任何其他特定数字向量。
我尝试使用match(x,list)
,它提供了一个充满NA的向量,which(list==(c(1,2,3))
,它给了我一个&#34;(列表)对象无法强制键入&# 39;双&#39;&#34;错误。将列表强制转换为不同的类型并不会对哪个函数产生影响。我还尝试了各种grep *函数,但这些函数不会返回精确的数字向量匹配。使用find(c(1,2,3),list)
甚至一些花哨的sapply
%%in type函数并没有给我我想要的东西。我觉得我有类型问题。有什么建议吗?
- Update-- 解决方案摘要
感谢您的回复。这个问题的评论中的方法很干净,效果很好(通过akrun)。
> which(paste(list)==deparse(x))
[1] 25
下一个方法无法正常工作
> which(duplicated(c(x, list(y), fromLast = TRUE)))
[1] 49
> y
[1] 1 2 3
这听起来不错,但在下一个区块中你可以看到问题
> y<-c(1,3,2)
> which(duplicated(c(list, list(y), fromLast = TRUE)))
[1] 49
更重要的是,我使用的列表中只有48个元素。
最后一种方法效果很好(通过BondedDust),我猜它使用apply函数效率更高:
> which( sapply(list, identical, y ))
[1] 25
答案 0 :(得分:3)
您可以使用duplicated()
。如果我们将匹配向量添加到原始列表的末尾并设置fromLast = TRUE
,我们将找到副本。然后我们可以使用which()
来获取索引。
which(duplicated(c(list, list(c(2, 1, 3)), fromLast = TRUE))
# [1] 3
或者您可以将其添加为第一个元素并从结果中减去1.
which(duplicated(c(list(c(2, 1, 3)), list))) - 1L
# [1] 3
请注意,这种类型的比较总是很重要。在比较整数和数字时,您需要将双精度转换为整数,以便运行时没有问题。例如,1:3
与c(1, 2, 3)
的类型不同。
答案 1 :(得分:3)
match
可以正常工作。
L <- list(c(1,2,3),c(1,3,2),c(2,1,3))
match(list(c(2,1,3)), L)
#[1] 3
请注意,这可以通过强制列表到角色来实现,因此边缘情况会失败 - 给@nicola一个小贴士:
match(list(1:3),L)
#[1] NA
即使:
1:3 == c(1,2,3)
#[1] TRUE TRUE TRUE
虽然可以说:
identical(1:3,c(1,2,3))
#[1] FALSE
identical(1:3,c(1L,2L,3L))
#[1] TRUE
答案 2 :(得分:2)
尝试:
vapply(list,function(z) all(z==x),TRUE)
#[1] FALSE FALSE TRUE
将上述行封闭到which
会给出列表的索引。
答案 3 :(得分:2)
> L <- list(c(1,2,3),c(1,3,2),c(2,1,3))
> sapply(L, identical, c(2,1,3))
[1] FALSE FALSE TRUE
> which( sapply(L, identical, c(2,1,3)) )
[1] 3
在测试中限制性稍差:
> which( sapply(L, function(x,y){all(x==y)}, c(1:3)) )
[1] 1