我一直试图使用dplyr
对一些面板数据(即组内的ID)进行子集化。
我想确定所有id
s,在每个组中,grp
有一个NUM
系列,最小值小于2,最大值大于2.我在下面构建了一个最小的工作示例来说明问题。
我一直在与filter()
,row_number() == c(1,n())
合作,并尝试将它分开并合并,即不同类型的_join
,它重新组合在一起,但我陷入困境,我现在转向SO社区寻求帮助。
像这样的tibble
,
df <- tibble(id = rep(0:1, c(8, 13)), grp = rep(c("01", "02"), c(13, 8)),
NUM = c(-4, -3, -2, -1, 1, 2, 3, 4, -3, -2, -1,
1, 2, -3, -2, -1, 1, 2, 3, 4, 5)) %>% group_by(id, grp)
df %>% print(n=21)
#> # A tibble: 21 x 3
#> # Groups: id, grp [3]
#> id grp NUM
#> <int> <chr> <dbl>
#> 1 0 01 -4
#> 2 0 01 -3
#> 3 0 01 -2
#> 4 0 01 -1
#> 5 0 01 1
#> 6 0 01 2
#> 7 0 01 3
#> 8 0 01 4
#> 9 1 01 -3
#> 10 1 01 -2
#> 11 1 01 -1
#> 12 1 01 1
#> 13 1 01 2
#> 14 1 02 -3
#> 15 1 02 -2
#> 16 1 02 -1
#> 17 1 02 1
#> 18 1 02 2
#> 19 1 02 3
#> 20 1 02 4
#> 21 1 02 5
df_out <- tibble(id = rep(0:1, c(9, 8)),
grp = rep(c("01", "02"), c(9, 8)),
NUM = c(-4, -3, -2, -1, 1, 2, 3,
4, 5, -3, -2, -1, 1, 2, 3, 4, 5)) %>% group_by(id, grp)
df_out
#> # A tibble: 17 x 3
#> # Groups: id, grp [3]
#> id grp NUM
#> <int> <chr> <dbl>
#> 1 0 01 -4
#> 2 0 01 -3
#> 3 0 01 -2
#> 4 0 01 -1
#> 5 0 01 1
#> 6 0 01 2
#> 7 0 01 3
#> 8 0 01 4
#> 9 1 02 -3
#> 10 1 02 -2
#> 11 1 02 -1
#> 12 1 02 1
#> 13 1 02 2
#> 14 1 02 3
#> 15 1 02 4
#> 16 1 02 5
像这样?
library(dplyr)
filter(df, any(NUM > 2) & any(NUM < -2))
# A tibble: 16 x 3
# Groups: id, grp [2]
id grp NUM
<int> <chr> <dbl>
1 0 01 -4.00
2 0 01 -3.00
3 0 01 -2.00
4 0 01 -1.00
5 0 01 1.00
6 0 01 2.00
7 0 01 3.00
8 0 01 4.00
9 1 02 -3.00
10 1 02 -2.00
11 1 02 -1.00
12 1 02 1.00
13 1 02 2.00
14 1 02 3.00
15 1 02 4.00
16 1 02 5.00
另外,如果一个精确值的子集,比如第一个NUM
是-3
而最后一个NUM
是5
,即原始数据中的第9-16行,那么这可以这样做,
df %>%
group_by(id, grp) %>%
mutate(first = first(NUM)
,last = last(NUM)) %>%
filter(-3 == first & 5 == last) %>%
select(-first, -last)
#> # A tibble: 8 x 3
#> # Groups: id, grp [1]
#> id grp NUM
#> <int> <chr> <dbl>
#> 1 1 02 -3
#> 2 1 02 -2
#> 3 1 02 -1
#> 4 1 02 1
#> 5 1 02 2
#> 6 1 02 3
#> 7 1 02 4
#> 8 1 02 5
以上灵感来自this SO answer。