R:如何在不使用循环的情况下按唯一向量顺序查找所有重复向量值的索引?

Posted

技术标签:

【中文标题】R:如何在不使用循环的情况下按唯一向量顺序查找所有重复向量值的索引?【英文标题】:R: how to find index of all repetition vector values order by unique vector without using loop? 【发布时间】:2016-06-30 16:08:26 【问题描述】:

我有一个这样的整数向量:

a <- c(2,3,4,1,2,1,3,5,6,3,2)
values<-c(1,2,3,4,5,6)

我想为向量中的每个唯一值(被排序的唯一值)列出它们出现的位置。我想要的输出:

rep_indx<-data.frame(c(4,6),c(1,5,11),c(2,7,10),c(3),c(8),c(9))

【问题讨论】:

你想要的输出没有意义。 【参考方案1】:

split 非常适合这里,它返回a 中每个唯一值的索引列表:

indList <- split(seq_along(a), a)
indList
# $`1`
# [1] 4 6
# 
# $`2`
# [1]  1  5 11
# 
# $`3`
# [1]  2  7 10
# 
# $`4`
# [1] 3
# 
# $`5`
# [1] 8
# 
# $`6`
# [1] 9

您可以通过将值作为字符传递来访问索引,即:

indList[["1"]]
# [1] 4 6

【讨论】:

【参考方案2】:

您可以使用sapply 执行此操作。 sort 函数确保了您需要的排序。

sapply(sort(unique(a)), function(x) which(a %in% x))
#### [[1]]
#### [1] 4 6
#### 
#### [[2]]
#### [1]  1  5 11
#### ...

它会生成一个列表,给出你的重复索引。它不能是 data.frame,因为 data.frame 需要具有相同长度的列。

sort(unique(a)) 正是您的 vector 变量。

注意:您也可以使用lapply 强制输出为列表。使用sapply,您会得到一个列表,除非碰巧复制的数量始终相同,那么输出将是一个矩阵......所以,您的选择!

【讨论】:

【参考方案3】:

也许这也有效

order(match(a, values))
#[1]  4  6  1  5 11  2  7 10  3  8  9

【讨论】:

【参考方案4】:

您可以使用lapply 函数返回带有索引的列表。

lapply(values, function (x) which(a == x))

【讨论】:

以上是关于R:如何在不使用循环的情况下按唯一向量顺序查找所有重复向量值的索引?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不重置浏览器状态的情况下按顺序运行多个 RSpec/Selenium 测试吗?

如何在没有递归或堆栈但使用父指针的情况下按顺序遍历 BST?

有没有办法在不安装包的情况下按字母顺序排列 package.json?

如何在不递归的情况下找到所有可能的字谜?

在没有循环的情况下按行计算 pandas 中的余弦相似度

如何在不考虑时间的情况下按日期时间列分组