R-如何检查给定值是否属于列表中的向量



假设我们有一个值y = 4,并且一个向量列表,我想检查一下此值是否属于列表中的任何向量,如果是,我会添加此值向量的要素。

 y<-4
 M<- list( c(1,3,4,6) , c(2,3,5), c(1,3,6) ,c(1,4,5,6))
> M
[[1]]
[1] 1 3 4 6
[[2]]
[1] 2 3 5
[[3]]
[1] 1 3 6
[[4]]
[1] 1 4 5 6

结果将类似于:

 > R
  [[1]]
  [1] 5 7 8 10
[[2]]
[1] 5 8 9 10

我们可以使用keep,只能使谓词满足元素。在这种情况下,它仅保留包含y的向量。

然后,我们将y添加到每个向量。

library('tidyverse')
keep(M, ~y %in% .) %>%
  map(~. + y)

这是一种简单的骇客方法:

lapply(M[sapply(M, function(x){y %in% x})],function(x){x+y})

返回:

[[1]]
[1]  5  7  8 10
[[2]]
[1]  5  8  9 10

逻辑:使用sapply来算出M的哪个部分具有4英寸,然后将4添加到lapply

的那些部分

您可以使用...

进行此操作
lapply(M[sapply(M, `%in%`, x=y)], `+`, y)
[[1]]
[1]  5  7  8 10
[[2]]
[1]  5  8  9 10

这是一种具有lapply并设置功能的方法。

# loop through M, check length of intersect
myList <- lapply(M, function(x) if(length(intersect(y, x)) > 0) x + y else NULL)
# now subset, dropping the NULL elements
myList <- myList[lengths(myList) > 0]

这返回

myList
[[1]]
[1]  5  7  8 10
[[2]]
[1]  5  8  9 10

哇!每个人都给出了很好的答案,包括使用地图功能。

Map("+",M[unlist(Map("%in%", y,M))],y)
[[1]]
[1]  5  7  8 10
[[2]]
[1]  5  8  9 10

最新更新