当前位置: 首页 > 知识库问答 >
问题:

两个列表中元素跨向量的部分交集

丰超
2023-03-14
mylist <- list(PP = c("PP 1", "OMITTED"),
           IN01 = c("DID NOT PARTICIPATE", "PARTICIPATED", "OMITTED"),                     
           RD1 = c("YES", "NO", "NOT REACHED", "INVALID", "OMITTED"),
           RD2 = c("YES", "NO", "NOT REACHED", "NOT AN OPTION", "OMITTED"),
           LOS = c("LESS THAN 3", "3 TO 100", "100 TO 500", "MORE THAN 500", "LOGICALLY NOT APPLICABLE", "OMITTED"),
           COM = c("BAN", "SBAN", "RAL"), 
           VR1 = c("WITHIN 30", "WITHIN 200", "NOT AVAILABLE", "OMITTED"),                         
           INF = c("A LOT", "SOME", "LITTLE OR NO", "NOT APPLICABLE", "OMITTED"),               
           IST = c("FULL-TIME", "PART-TIME", "FULL STAFFED", "NOT STAFFED", "LOGICALLY NOT APPLICABLE", "OMITTED"),
           CMP = c("ALL", "MOST", "SOME", "NONE", "LOGICALLY NOT APPLICABLE", "OMITTED"))

我还有一张这样的单子:

matchlist <- list("INVALID", c("INVALID", "OMITTED OR INVALID"),
c("INVALID", "OMITTED"), "OMITTED", c("NOT REACHED", "INVALID", "OMITTED"),
c("LOGICALLY NOT APPLICABLE", "INVALID", "OMITTED"),
c("LOGICALLY NOT APPLICABLE", "INVALID", "OMITTED OR INVALID"),
c("Not applicable", "Not stated"), c("Not reached", "Not administered/missing by design", "Presented but not answered/invalid"),
c("Not administered/missing by design", "Presented but not answered/invalid"),
"OMITTED OR INVALID",
c("LOGICALLY NOT APPLICABLE", "OMITTED OR INVALID"),
c("NOT REACHED", "OMITTED"),
c("NOT APPLICABLE", "OMITTED"), 
c("LOGICALLY NOT APPLICABLE", "OMITTED"),
c("LOGICALLY NOT APPLICABLE", "NOT REACHED", "OMITTED"),
"NOT EXCLUDED", c("Default", "Not applicable", "Not stated"), c("Valid Skip", "Not Reached", "Not Applicable", "Invalid", "No Response"),
c("Not administered", "Omitted"),
c("NOT REACHED", "INVALID RESPONSE", "OMITTED"),
c("INVALID RESPONSE", "OMITTED"))

如您所见,matchlist中的某些向量与mylist中的向量部分匹配。在某些情况下,matchlist中的向量与mylist中的部分向量完全匹配。例如,mylist中的rd1的最后一个值与matchlist的第五个组件中的向量匹配,但rd2与之不匹配,尽管存在公共值。在mylist中的rd2中的值(“未达到”、“不是选项”、“省略”)按此顺序一起在matchlist中的任何向量中都不匹配。对于MyList中的COM的值也是相同的。

我试图实现的是将mylist中的每个向量中的元素matchlist中的每个向量进行比较,提取通用的值并以相同的顺序匹配matchlist中的值,并将它们存储在另一个列表中。期望的结果如下所示:

$PP
[1] "OMITTED"

$IN01
[1] "OMITTED"

$RD1
[1] "NOT REACHED" "INVALID" "OMITTED"

$RD2
character(0)

$LOS
[1] "LOGICALLY NOT APPLICABLE" "OMITTED"

$COM
character(0)

$VR1
[1] "OMITTED"

$INF
[1] "NOT APPLICABLE" "OMITTED"

$IST
[1] "LOGICALLY NOT APPLICABLE" "OMITTED"

$CMP
[1] "LOGICALLY NOT APPLICABLE" "OMITTED"

到目前为止我所尝试的:

使用intersect

lapply(mylist, function(i) {
  intersect(i, lapply(matchlist, function(i) {i}))
})

它只返回matchlist(“省略”)每个向量中的最后一个值。

lapply(mylist, function(i) {
  i[which(i %in% matchlist)]
})
mapply(intersect, mylist, matchlist)

共有1个答案

满俊楠
2023-03-14

有一些真正简单/好的答案,但它们似乎都依赖于unlist。我假设您需要保留matchlist中的分组,因此取消列出它们是没有意义的。这里有一个解决方案,在开始时使用双lapply循环:

out <- lapply(mylist, function(this) {
  mtch <- lapply(matchlist, intersect, this)
  wh <- which.max(lengths(mtch))
  if (length(wh)) mtch[[wh]] else character(0)
})
str(out)
# List of 9
#  $ PP  : chr "OMITTED"
#  $ IN01: chr "OMITTED"
#  $ RD1 : chr [1:3] "NOT REACHED" "INVALID" "OMITTED"
#  $ LOS : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"
#  $ COM : chr(0) 
#  $ VR1 : chr "OMITTED"
#  $ INF : chr [1:2] "NOT APPLICABLE" "OMITTED"
#  $ IST : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"
#  $ CMP : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"

它总是返回一个匹配数最多的向量,但如果有(不知怎么的)不止一个,我认为它将保持自然顺序,返回所述长匹配的第一个。(问题是:“which.max是否保持自然秩序?”我认为它保持了自然秩序,但没有得到验证。)

更新

out <- lapply(mylist, function(this) {
  ind <- lapply(matchlist, function(a) which(this == a[1]))
  perfectmatches <- mapply(function(ml, allis, this) {
    length(ml) * any(sapply(allis, function(i) all(ml == this[ i + seq_along(ml) - 1 ])))
  }, matchlist, ind, MoreArgs = list(this=this))
  if (any(perfectmatches) > 0) {
    wh <- which.max(perfectmatches)
    return(matchlist[[wh]])
  } else return(character(0))
})
str(out)
# List of 9
#  $ PP  : chr "OMITTED"
#  $ IN01: chr "OMITTED"
#  $ RD1 : chr "INVALID"
#  $ LOS : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"
#  $ COM : chr(0) 
#  $ VR1 : chr "OMITTED"
#  $ INF : chr [1:2] "NOT APPLICABLE" "OMITTED"
#  $ IST : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"
#  $ CMP : chr [1:2] "LOGICALLY NOT APPLICABLE" "OMITTED"
 类似资料:
  • 问题内容: 我在看Hough Transform的Opencv Java文档 。 返回值的数据类型描述为: 线的输出向量。每行由一个二元素矢量(rho,θ)表示。rho是距坐标原点(0,0)(图像的左上角)的距离。theta是弧度的直线旋转角度(0〜垂直线,pi / 2〜水平线)。 奇怪的是,此描述与C ++接口的描述匹配, 但是 数据类型与之不匹配:在C 中,您可以 按照本教程中的描述使用a 。

  • 问题内容: 写一个方法 公共静态ArrayList merge(ArrayList a,ArrayList b) 合并两个数组列表,两个数组列表中的元素交替出现。如果一个数组列表短于另一个数组列表,则请尽可能长地交替,然后附加较长数组列表中的其余元素。例如,如果a是 1 4 9 16 b是 9 7 4 9 11 然后合并返回数组列表 1 9 4 7 9 4 16 9 11 我尝试做的是编写一个带i

  • 问题内容: 我有两个三个整数的对象。我想找到一种方法来返回两个列表的共同元素。有谁知道我如何实现这一目标? 问题答案: 使用。 如果要避免更改受到影响listA,则需要创建一个新的更改。

  • 问题内容: 如何以简洁明了的方式找出两个列表中的第一个公共元素(在本例中为“ 2”)?任何列表都可以为空,也可以没有公共元素-在这种情况下,没有一个很好。 我需要它来向新手展示python,所以越简单越好。 UPD:顺序对于我的目的并不重要,但让我们假设我正在寻找x中的第一个元素,该元素也出现在y中。 问题答案: 这应该很简单 几乎和它一样有效 (要获得更有效的解决方案,请检查Ashwini Ch

  • 问题内容: 我想将迭代器分为两个具有交替元素的列表。这是一个可行的解决方案。但是,有没有更简单的方法可以达到相同目的呢? 样本输出: 问题答案: 如果是一个序列,则: 如果是完全通用的可迭代对象,例如生成器:

  • 问题:我希望编写一个脚本,同时循环两个列表,并将列表1中的日期替换为列表2中的日期。因此,很明显,您将使用清单2中的前70个日期替换清单1中的70个日期。之后,我希望将修改后的list1写入一个。txt文件。 我试过了,但我完全卡住了。我是Python的超级noob。