2013-03-17 26 views
0

元件,清洁矢量与发生在与像下面的向量提交系列

vec01 <- c(1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 2, 1, 
      2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 
      1, 2, 2, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 1, 1, 1, 
      2, 1, 2, 3, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 
      1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1) 

问题1:怎样去除异常下面突出显示:

vec01 <- c(1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 1, 2, 1, 
      2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, *2*, *2*, 
      1, 2, *2*, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 1, 1, 1, 
      2, 1, 2, 3, 4, *2*, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 
      1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1) 

异常的定义:该元件需要是部分系列1,2,...以上加粗标记的部分

问题2:如何识别删除异常后的系列组,每个序列属于一个组i。即,像

result <- structure(list(vec = c(1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 3L, 
           4L, 5L, 6L, 7L, 8L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
           1L, 1L, 1L, 2L, 1L, 2L), 
         group = c(1L, 1L, 2L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 8L, 
            8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 
            11L, 12L, 13L, 14L, 15L, 15L, 16L, 16L)), 
         .Names = c("vec", "group"), 
         row.names = c(NA, 30L), class = "data.frame") 
+0

什么用粗体标出?你的“定义”需要更多的解释。我不清楚。问题2中的“系列组”是什么? – Arun 2013-03-17 10:41:50

+0

@Arun我认为OP试图通过常规'序列'来寻找组:123是好序列,但是122不是常规序列。 – agstudy 2013-03-17 10:45:58

+0

是@ agstudy..thats我的意思是 – srbhgaur 2013-03-17 10:47:44

回答

2

有趣的问题取代is.unsorted,这里是另一种解决方案。它看起来值正在增加,并建立相应的理想(无异常)序列vec02。那么这只是比较vec01vec02的问题。

is.incr <- c(FALSE, diff(vec01) == 1) 
vec02 <- rep(1, length(vec01)) + sequence(rle(is.incr)$lengths) * is.incr 
vec  <- vec01[vec01 == vec02] 
result <- data.frame(vec = vec, group = cumsum(vec == 1)) 
2

一个输出清洁序列(问题1):

m <- vec01[1]==1 
for (i in seq(2,length(vec01))) 
    m[i] <- vec01[i]==1 || vec01[i]==vec01[i-1]+1 && m[i-1] 
vec01 <- vec01[m] 

现在使你的期望结构(感谢@statquant为cumsum()想法):

data.frame(vec=vec01, group=cumsum(c(1,diff(vec01)!=1))) 
+0

哪个问题是这个答案? – Arun 2013-03-17 10:43:04

+0

是的,这正确识别异常...... prob1解决 – srbhgaur 2013-03-17 10:47:00

+0

我的实际数据集是13mn + ...任何建议如何避免循环... – srbhgaur 2013-03-17 11:10:37

7

这里是问题2(问题1,如果你最后删除全部TRUE)

library(data.table) #load data.table because syntax is nice (matter of pers taste) 
DT = data.table(vec01) 
DT[,counter:=ifelse(vec01==1,1,0)] #identify each sequence starting with one 
DT[,counter:=cumsum(counter)] #trick to give a diff ID to each seq so we can use by 
DT[,flag:=is.unsorted(vec01),by=counter] #check sorting for each sequence 

编辑:由f(vec01)f = function(x){!(x==Reduce(max,x,accumulate=T))}

+0

一个概率...我得到异常= TRUE为整个组... 12322所有元素都标记为TRUE ... 123需要假... – srbhgaur 2013-03-17 11:07:39

+0

确定然后创建一个函数说'f '采用12322这样的UNIQUE序列并返回相应的TTTFF,并用'f'替换'is.unsorted'。你能做到吗? – statquant 2013-03-17 11:12:35

+0

有些是downvoting所有答案:) – Arun 2013-03-17 11:45:19