2016-06-08 50 views
2

我的數據如下所示(我在數據集中更多的變數和組):提取子

group x time 
1 0 1636 
1 0 1637 
1 0 1638 
1 1 1639 
1 1 1640 
1 1 1641 
1 1 1642 
2 0 1683 
2 0 1684 
2 0 1685 
2 0 1686 
2 0 1687 
2 0 1688 
2 1 1689 
2 1 1690 
2 1 1691 
3 0 1638 
3 1 1639 
3 1 1640 

每個group都有自己的時間系列(time表示)。我需要的是在x之前和之後的固定數量的觀察值對於某個組值爲1。例如,在x取1和3個觀察值(從而觀察3個觀察值)之前總是有3個觀測值(因此3個觀察值在3之前)。如果在之前或之後沒有足夠的觀察結果,我想刪除該組的時間序列。然後

數據將如下所示:

group x time 
1 0 1636 
1 0 1637 
1 0 1638 
1 1 1639 
1 1 1640 
1 1 1641 
2 0 1686 
2 0 1687 
2 0 1688 
2 1 1689 
2 1 1690 
2 1 1691 

關於如何做到這一點有什麼建議?

回答

3

我們創建了一個獨特的group_indices()通過groupx,然後我們會過濾少於3個觀測和row_number()小號意見,其中x != 1%in%範圍n()(組大小)組n()-2只保留了三​​點意見之前發生x的變化。

library(dplyr) 

df %>% 
    mutate(g = group_indices_(., .dots = c("group", "x"))) %>% 
    group_by(g) %>% 
    mutate(condition = ifelse(x == 1, NA, row_number())) %>% 
    filter(n() >= 3, ifelse(is.na(condition), TRUE, condition %in% n():(n()-2))) 

其中給出:

#Source: local data frame [13 x 5] 
#Groups: g [4] 
# 
# group  x time  g condition 
# <int> <int> <int> <int>  <int> 
#1  1  0 1636  1   1 
#2  1  0 1637  1   2 
#3  1  0 1638  1   3 
#4  1  1 1639  2  NA 
#5  1  1 1640  2  NA 
#6  1  1 1641  2  NA 
#7  1  1 1642  2  NA 
#8  2  0 1686  3   4 
#9  2  0 1687  3   5 
#10  2  0 1688  3   6 
#11  2  1 1689  4  NA 
#12  2  1 1690  4  NA 
#13  2  1 1691  4  NA 

您可以選擇通過添加select(-(g:condition))到鏈除去gcondition列。


數據

df <- structure(list(group = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), x = c(0L, 0L, 0L, 1L, 
1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L), 
    time = c(1636L, 1637L, 1638L, 1639L, 1640L, 1641L, 1642L, 
    1683L, 1684L, 1685L, 1686L, 1687L, 1688L, 1689L, 1690L, 1691L, 
    1638L, 1639L, 1640L)), .Names = c("group", "x", "time"), 
class = "data.frame", row.names = c(NA, -19L)) 
+0

謝謝!這隻保留了每組的最初3次第一次觀察,而不是在x變爲1之前的3次觀察。例如,對於組2,時間序列從1685跳到1689,而不是保持觀察值1688 1687和1686. – research111

+0

I可能沒有完全清楚。在第2組中,觀測值'1686 1687'和'1688'是在x取值爲1之前的觀測值。我想提取這3個值,而目前'1683,1684'和'1685'被提取。 '1689 1690'和'1691'是在'x'取值1之後的觀察值,現在正確採用。這是清楚的嗎?所以我想只保留'1686 1687'和'1688' – research111

+0

那會很棒..非常感謝! – research111