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

时间:2017-10-03 14:47:36

标签: r list vector

假设我们有一个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

5 个答案:

答案 0 :(得分:3)

这是一个简单的hacky方法:

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

答案 1 :(得分:3)

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

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

library('tidyverse')

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

答案 2 :(得分:3)

你可以用......

来做到这一点
lapply(M[sapply(M, `%in%`, x=y)], `+`, y)

[[1]]
[1]  5  7  8 10

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

答案 3 :(得分:1)

以下是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

答案 4 :(得分:0)

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

Map("+",M[unlist(Map("%in%", y,M))],y)

[[1]]
[1]  5  7  8 10

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