从R

时间:2015-11-03 06:22:10

标签: r list vector indexing matching

在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

4 个答案:

答案 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:3c(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