【发布时间】:2022-02-19 02:25:14
【问题描述】:
我正在尝试对一些数据进行排序,这些数据标有 id、group_id 和状态代码。这是一个例子:
library(tidyverse)
sample <- tibble(id = c(1:20),
group_id = c(rep(1,3),rep(4,4),rep(8,5),rep(13,3),rep(16,1),rep(17,1),rep(18,3)),
status_code = c("initial","initial","final","initial","initial","initial","sold","initial","initial","initial","initial","error",
"initial","initial","final","final","error","initial","final","final")
)
sample %>%
head()
# A tibble: 6 x 3
id group_id status_code
<int> <dbl> <chr>
1 1 1 initial
2 2 1 initial
3 3 1 final
4 4 4 initial
5 5 4 initial
6 6 4 initial
我想做的是按group_id 对它们进行分组,并仅保留满足以下条件的观察结果:
- 状态代码(最终、已售、错误)在
group_id中出现多次 - “final”、“sold”或“error”出现不止一次
在我上面的例子中,group_id == 18 应该被过滤,因为代码“final”出现了两次。但这也应该是“最终”代码之一被替换为“已售”或“错误”的情况。
基本上,我希望能够轻松地拆分数据,如下所示:
# Conditions met
# A tibble: 3 x 3
id group_id status_code
<int> <dbl> <chr>
1 18 18 initial
2 19 18 final
3 20 18 final
# Conditions not met
# A tibble: 17 x 3
id group_id status_code
<int> <dbl> <chr>
1 1 1 initial
2 2 1 initial
3 3 1 final
4 4 4 initial
5 5 4 initial
6 6 4 initial
7 7 4 sold
8 8 8 initial
9 9 8 initial
10 10 8 initial
11 11 8 initial
12 12 8 error
13 13 13 initial
14 14 13 initial
15 15 13 final
16 16 16 final
17 17 17 error
我的数据显然有更多的列,应该都保留在每个子帧中。到目前为止,我已经能够通过计数、保留 status_code 并再次过滤主要数据来实现这一点:
condition <- sample %>%
filter(status_code != "initial") %>% # Removing "initial" status_code
count(group_id) %>% # Counting the number of remaining occurences in each group
filter(n > 1) %>% # Keeping groups where more than one occurence
select(group_id) # Selecting the group_ids
fitlered_sample <- left_join(condition,sample, by ="group_id")
# A tibble: 3 x 3
group_id id status_code
<dbl> <int> <chr>
1 18 18 initial
2 18 19 final
3 18 20 final
它有效,但我希望这可以在不创建“条件”数据框的情况下实现。我更喜欢 dplyr 解决方案,但我也可以使用 base 或 data.table
【问题讨论】:
标签: r dplyr data.table tidyverse filtering