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