在一个向量中找到元素之间的序列

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
2个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接