【问题标题】:A non index-oriented way to search for unique values between two lists in R一种非面向索引的方法来搜索 R 中两个列表之间的唯一值
【发布时间】:2016-07-18 19:01:13
【问题描述】:

假设我有一个如下所示的列表部分:

aaa[[1]]
# [1] "A5-5,73"  "B3-4,73"  "E3-8,73"  "A1-8,73"  "C1-7,73"  "A1-2,73"  "C3-2,73"  "C1-1,73"

假设我有另一个列表,其中的部分如下所示:

bbb[[1]]
# [1] "B3-4,73"  "C3-2,73"  "A5-5,73"  "A1-8,73"  "A1-2,73"  "A1-5,73"  "B1-1,73"  "C1-4,73"

考虑一下我现在运行

which(aaa[[1]]!= bbb[[1]])

返回

# [1]  1  2  3  5  6  7  8  

这在技术上是正确的,因为[4] 的索引在aaabbb 中是相同的

我想要返回的是:

# [1] "C1-7,73"  "A1-2,73" "C1-1,73"

因为这些是aaa 的值,它们不在bbb 中,无论位置如何。我也愿意接受只提供索引号的解决方案,例如:

# [1] 5 6 8

这是一个可重现的示例:

aaa <- vector("list")
aaa[[1]] <- c("A5-5,73",  "B3-4,73",  "E3-8,73",  "A1-8,73",
          "C1-7,73",  "A1-2,73",  "C3-2,73",  "C1-1,73")
bbb <- vector("list")
bbb[[1]] <- c("B3-4,73",  "C3-2,73",  "A5-5,73",  "A1-8,73",
          "A1-2,73",  "A1-5,73",  "B1-1,73",  "C1-4,73")

【问题讨论】:

  • 我想你想要setdiff(),就像setdiff(aaa[[1]], bbb[[1]])一样
  • 而你想要返回的和数据不匹配。 E3-8,73 而不是 A1-2,73,是吗?
  • 以上两个cmets都是正确的。我不知道setdiff
  • @RichardScriven 回答这个问题。

标签: r indexing unique


【解决方案1】:

如果您想将列表 aaa 的每个元素与对应的元素 bbb 进行比较,只需这样做。

mapply(FUN = setdiff, x = aaa, y = bbb)

在写这篇文章时,我看到 @RichardScriven 在 cmets 中已经提到了 setdiff

【讨论】:

  • 不错的猜测是 OP 想要在列表中按元素执行此操作(假设这实际上是正确的......),我想知道为什么没有简化。
  • @Richard Scriven 好吧,谢谢,但这不公平,你先想出了解决方案。
  • 如果我想发布答案,我会这样做。真的,不用担心。
【解决方案2】:

正如@Richard Scriven 在他的评论中提到的那样

setdiff(aaa[[1]], bbb[[1]])

是获取元素的方式。由于您还要求提供索引号,因此您可以使用 which()

which(aaa[[1]] %in% setdiff(aaa[[1]], bbb[[1]]))

虽然 %in% 产生逻辑值,但 which() 告诉它们在哪里是 TRUE。

【讨论】:

  • 第二个不需要setdiff,只要which(! a %in% b)
猜你喜欢
  • 1970-01-01
  • 2016-04-14
  • 2013-01-05
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多