data <- list(a=c(1,3,5), b=c(3,4,7,4,8,6), c=c(3,4,8,3,4,8,0))
sample <- c(4,8)
有什么办法来检索包含序列c(4,8)
列表成员?
在这种情况下,那将是data$b
和data$c
。
data <- list(a=c(1,3,5), b=c(3,4,7,4,8,6), c=c(3,4,8,3,4,8,0))
sample <- c(4,8)
有什么办法来检索包含序列c(4,8)
列表成员?
在这种情况下,那将是data$b
和data$c
。
这将从列表 - data
返回合适的逻辑矢量为项目的选择:
sapply(data, function(x) any(
intersect(which(x==sample[1]), # check for first value
# then see if any of those locations also have successive differences are the same as in the `sample` item.
which(diff(x) == diff(sample))) ))
$a
[1] FALSE
$b
[1] TRUE
$c
[1] TRUE
插图:
data[ sapply(data, function(x) any(intersect( which(x==sample[1]),
which(diff(x) == diff(sample)))))
]
#----------
$b
[1] 3 4 7 4 8 6
$c
[1] 3 4 8 3 4 8 0
如果“sample”向量有更多元素,这个代码是否工作?@ 42- – mousadafousa
data[grep(paste0(c("", sample, ""), collapse = "_"),
paste0("_", sapply(data, paste0, collapse = "_"), "_"))]
# $b
# [1] 3 4 7 4 8 6
#
# $c
# [1] 3 4 8 3 4 8 0
谢谢你,精美的作品。你介意解释这是如何工作的吗?或者这不是要问这个问题的地方? @Julius – mousadafousa
使用长度为零的折叠字符串意味着您可以使用“48”或使用“34,81”的顺序来匹配矢量。更安全的是使用''_“'并且将”_“粘贴到”sample“项目的末尾。 –
@mousadafousa,无论如何,尝试看看这条线的每一部分都是有用的。 1)'paste0(sample,collapse =“”)'给出''48“',2)'sapply(data,paste0,collapse =”“)'给出一个带有”135“'的元素的字符向量。然后'grep'检查这个向量的哪些元素有一个字符串'“48”'并返回它们的索引。 – Julius
请问'C(8,4)',' c(4,0,8)'等等呢? – Julius
所以你想检查有4个和8个连续元素的列表成员,或者是不相关的位置? – ytk
@Julius不,它应该是相同的顺序。 – mousadafousa