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

时间:2016-12-20 13:52:09

标签: r vector

我有一个矢量如下:

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

如何提取值1,9,97和41(即没有NA的每个子集的第一个和最后一个位置)?

我考虑过将head(v, 1)tail(v, 1)结合使用。但是,我不知道如何“停止”NAs并在它们之后重新启动。

3 个答案:

答案 0 :(得分:3)

我们根据逻辑向量(rleid)创建一个is.na(v)的分组变量,在tapply中使用该变量来选择每个组的第一个和最后一个值,{{1} } unlist输出,使用list删除NA元素,并使用na.omit删除属性。

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

base R

答案 1 :(得分:1)

基于R的另一种可能的解决方案可能是split基于向量中的NA条目,lapply headtail函数并删除{ {1}},即

NA

答案 2 :(得分:1)

基础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