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