的那些部分
假设我们有一个值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