2017-04-04 74 views
4

我想获得向量中元素之间的序列。这是一个可重现的例子。在一个向量中查找元素之间的序列

vec <- c('a', letters[2:7], 'a', letters[9:14], 'a', letters[16:21]) # sample data 
ind_a <- which(grepl('a', vec)) # indices matching the character 'a' 
ind_a <- c(ind_a, length(vec)+1) # concatenate the length of 'vec' + 1 with indices 
ind_a 
# [1] 1 8 15 22 

现在,如何计算ind_a元素之间的序列。例如,seq(from = 2, to = 7, by = 1)和其他人一样。

最好,我想知道在这个任务基地R的任何功能。

期望输出

# List of 3 
# $ : int [1:6] 2 3 4 5 6 7 
# $ : int [1:6] 9 10 11 12 13 14 
# $ : int [1:6] 16 17 18 19 20 21 

回答

4

我们通过移除姓氏和意见创建从“ind_a”两个载体,然后获取相应的元素序列与Map

Map(seq, ind_a[-length(ind_a)]+1, ind_a[-1]-1) 
#[[1]] 
#[1] 2 3 4 5 6 7 

#[[2]] 
#[1] 9 10 11 12 13 14 

#[[3]] 
#[1] 16 17 18 19 20 21 

或者像@ Zelazny7建议,删除第一个和最后一个元素可以使用headtail函数

Map(`:`, head(ind_a, -1) + 1, tail(ind_a, -1) - 1) 
+2

替代语法:'Map(seq,head(ind_a,-1)+ 1,tail(ind_a,-1)-1)' – Zelazny7

2
lapply(2:length(ind_a), function(i) setdiff(sequence(ind_a[i] - 1), sequence(ind_a[i-1]))) 
#OR  
lapply(2:length(ind_a), function(i) (ind_a[i-1]+1):(ind_a[i]-1)) 

#[[1]] 
#[1] 2 3 4 5 6 7 

#[[2]] 
#[1] 9 10 11 12 13 14 

#[[3]] 
#[1] 16 17 18 19 20 21 
相关问题