我有一个矢量如下:
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并在它们之后重新启动。
答案 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
head
和tail
函数并删除{ {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