R 在向量中选择多个head()和tail()值

R 在向量中选择多个head()和tail()值,r,vector,R,Vector,我有一个向量,如下所示: v <- c(1,3,4,5,6,7,8,9,NA,NA,NA,NA,27,25,30,41,NA,NA) v我们基于逻辑向量(is.na(v))创建一个带有rleid的分组变量,使用该变量在tapply中选择每个组的第一个和最后一个值,取消列出列表输出,使用NA删除NA元素。省略并使用c删除属性 library(data.table) c(na.omit(unlist(tapply(v, rleid(is.na(v)), function(x) c(x[1],

我有一个向量,如下所示:

v <- c(1,3,4,5,6,7,8,9,NA,NA,NA,NA,27,25,30,41,NA,NA)

v我们基于逻辑向量(
is.na(v)
)创建一个带有
rleid
的分组变量,使用该变量在
tapply
中选择每个组的第一个和最后一个值,
取消列出
列表
输出,使用
NA删除NA元素。省略
并使用
c
删除属性

library(data.table)
c(na.omit(unlist(tapply(v, rleid(is.na(v)), function(x) c(x[1], 
                                  x[length(x)])), use.names=FALSE)))
#[1]  1  9 27 41

或者另一个选项是
rle
from
base R

v[with(rle(!is.na(v)), {
         i1 <- cumsum(lengths)
         i2 <- lengths[values]
         c(rbind(i1[values] - i2 + 1 , i1[values]))
   })]
#[1]  1  9 27 41
v[带(rle(!is.na(v)){

i1另一个可能的解决方案是,通过基R根据向量中的
NA
条目
拆分
lappy
tail
函数并移除
NA
,即

ind <- unname(unlist(lapply(split(v, cumsum(c(1, diff(is.na(v)) != 0))), function(i) 
                                                           c(head(i, 1), tail(i, 1)))))

ind[!is.na(ind)]

#[1]  1  9 27 41
indA基本R解决方案:

x = na.omit( v[is.na(c(NA,diff(v))) | is.na(c(diff(v),NA))] )

> as.numeric(x)
# [1]  1  9 27 41

多亏了你们的回答和解释,我对数据的了解越来越多。表:)这会选择单个非NA元素两次。在
c(v,30)上试试
@siralen这可以通过使用
unique
包装来解决,我不确定这些情况下的行为,因为问题中没有解释这会选择单个非NA元素两次。在
c(v,30)上尝试
也许OP希望如此…?问题中没有解释。回到这个问题再举一个例子,它有重复的条目,您的答案非常有效!