2016-01-27 59 views
1

鉴于这种如何用另一个矢量对矢量进行子集划分?

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$bdata$c

+0

请问'C(8,4)',' c(4,0,8)'等等呢? – Julius

+0

所以你想检查有4个和8个连续元素的列表成员,或者是不相关的位置? – ytk

+0

@Julius不,它应该是相同的顺序。 – mousadafousa

回答

1

这将从列表 - 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 
+1

如果“sample”向量有更多元素,这个代码是否工作?@ 42- – mousadafousa

3
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 
+0

谢谢你,精美的作品。你介意解释这是如何工作的吗?或者这不是要问这个问题的地方? @Julius – mousadafousa

+0

使用长度为零的折叠字符串意味着您可以使用“48”或使用“34,81”的顺序来匹配矢量。更安全的是使用''_“'并且将”_“粘贴到”sample“项目的末尾。 –

+0

@mousadafousa,无论如何,尝试看看这条线的每一部分都是有用的。 1)'paste0(sample,collapse =“”)'给出''48“',2)'sapply(data,paste0,collapse =”“)'给出一个带有”135“'的元素的字符向量。然后'grep'检查这个向量的哪些元素有一个字符串'“48”'并返回它们的索引。 – Julius