R匹配两个列表并找到匹配的元素

时间:2015-05-25 07:31:01

标签: r list pattern-matching string-matching

我有两个清单:

lst1 <- list(c("environmental science", "environmental social science", "nature"),  c("bodies of water", "erosion landforms", "valleys"), c("meteorological concepts", "climate", "environmental"), c("fireplaces", "metalworking", "industrial"))

lst2 <- list(c("environmental social", "fragile", "ocean"),  c("air", "water", "rain water"), c("day", "astronomy"))

我想保留list元素的分组,并将lst1的元素与lst2的元素进行匹配。例如,在这种情况下,期望的答案如下:

[1] "environmental science" "environmental social science" "nature"  

在lst1和

[1] "meteorological concepts" "climate"  "environmental" 
lst1中的

有一些匹配
[1] "environmental social" "fragile"  "ocean"     

在lst2。

再次

[1] "bodies of water"   "erosion landforms" "valleys"
lst1中的

有一些匹配
[1] "air"        "water"      "rain water" 

在lst2。

所以答案是lst1和lst2中的INTERSECTING元素,如上所示。

如何解决这个问题?我们将非常感谢代码片段。

感谢。

1 个答案:

答案 0 :(得分:2)

我们可以尝试嵌套循环。在函数f1match中,我们遍历第一个列表(sapply(list1, function(x)),拆分每个元素(strsplit(x, ' ')),循环输出并像以前一样拆分list2的每个元素,检查是否有list2的拆分列表元素中的元素在list1中,再次检查条件以创建&#39; TRUE / FALSE&#39;的逻辑索引。这可以用于子集化&lt; lst1&#39;和&#39; lst2&#39;通过交换f1match

中的参数
f1match <- function(list1, list2){
     sapply(list1, function(x) any(sapply(strsplit(x, ' '), function(y)
     any(sapply(list2, function(x1) any(sapply(strsplit(x1, ' '), 
         function(y1) any(y1 %in% y))))))))
         }
indx1 <- f1match(lst1, lst2)
indx2 <- f1match(lst2, lst1)
indx1
#[1]  TRUE  TRUE  TRUE FALSE
indx2
#[1]  TRUE  TRUE FALSE

lst1[indx1]
lst2[indx2]