【问题标题】:match() to list of vectors - of possibly different lengths匹配()到向量列表 - 可能不同的长度
【发布时间】:2012-10-18 16:44:17
【问题描述】:

match(x, y) 函数非常适合在向量 y 的元素中搜索向量 x 的元素。但是,当y 是一个向量列表(长度可能不同)时,做类似工作的一种有效且简单的方法是什么?

我的意思是结果应该是一个与x长度相同的向量,第i个元素应该是y的第一个成员,它包含x的第i个元素,或者@987654328 @。

【问题讨论】:

  • 你的意思是像lapply(y, match, table = x)这样的东西吗?
  • 也许犹豫是否支持 Josh 的答案是由于对您想要的结果感到困惑。你想要y 的索引,x 中的每个元素是首先找到的吗?或者你想要一个长度列表y,其中每个元素的索引与x的元素匹配?
  • @BenBarnes 我更新了问题

标签: r list vector match


【解决方案1】:

要找到 x 的每个元素(第一个)出现在其中的 y 元素,试试这个:

## First, a reproducible example
set.seed(44)
x <- letters[1:25]
y <- replicate(4, list(sample(letters, 8)))
y
# [[1]]
# [1] "t" "h" "m" "n" "a" "d" "i" "b"
# 
# [[2]]
# [1] "c" "l" "z" "a" "s" "d" "i" "u"
# 
# [[3]]
# [1] "b" "k" "e" "g" "o" "i" "h" "j"
# 
# [[4]]
# [1] "g" "i" "f" "r" "h" "w" "l" "o"

## Find the element of y first containing the letters a-j
breaks <- c(0, cumsum(sapply(y, length))) + 1 
findInterval(match(x, unlist(y)), breaks)
# [1]  1  1  2  1  3  4  3  1  1  3  3  2  1  1  3 NA NA  4  2  1  2 NA  4 NA NA

【讨论】:

  • 极富创意的答案!谢谢
  • @AliSharifi -- 谢谢。我自己还挺喜欢的!
  • 太棒了!对中断的轻微重构:breaks &lt;- cumsum(c(1, sapply(groups, length)))
  • @nachocab -- 是的,这样更好。谢谢你,也谢谢你把我带回了这里。 findInterval 可以成为功能的真正瑰宝! (See here 是一个很酷的例子。)
猜你喜欢
  • 2018-12-31
  • 2022-11-16
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
相关资源
最近更新 更多