以连续的长度字符串为条件对面板数据进行子集化
subsetting Panel Data conditional on consecutive strings of length
我一直在尝试使用 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,t可以这样,
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.
我一直在尝试使用 dplyr
.
我想精确计算每个组中的所有 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,t可以这样,
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.