使用 grepl 和组中的相对行位置进行条件过滤

Conditional filtering using grepl and relative row position in group

我有一个类似于以下的数据集:

Journal_ref <- c("1111","2222","2222","2222","3333","3333","4444","4444")
Journal_type <- c("Adj","Rev","Adj","Rev","Rev","Rev","Adj","Adj")
Journal_value <- c(90,10000,12000,80,9000,500,65,2500)
Dataset <- data.frame(Journal_ref,Journal_type,Journal_value)

对于每个 Journal_ref 组,我根据以下条件寻找 filter/select 行:

基于上面的例子,需要的最终输出是:

Journal_ref Journal_type Journal_value
1111        Adj                    90
2222        Adj                 12000
3333        Rev                   500
4444        Adj                  2500

我尝试使用 group_byfilterififelsegreplselect 和 [= 的各种组合23=] 没有成功。

任何帮助将不胜感激,特别是使用 dplyr.

试试这个:

library(dplyr)

Dataset %>%
  group_by(Journal_ref, Journal_type) %>%
  summarise(Journal_value = last(Journal_value)) %>%
  ungroup() %>% group_by(Journal_ref) %>%
  filter(!(n() > 1 & Journal_type == "Rev"))

输出:

  Journal_ref Journal_type Journal_value
  <fct>       <fct>                <dbl>
1 1111        Adj                     90
2 2222        Adj                  12000
3 3333        Rev                    500
4 4444        Adj                   2500

一种dplyr方法如下。

library(dplyr)

Dataset %>%
  group_by(Journal_ref) %>%
  mutate(Adj = any(Journal_type == "Adj"),
         i = ifelse(Adj, last(which(Journal_type == "Adj")), last(which(Journal_type == "Rev")))) %>%
  filter(row_number() == i) %>%
  select(-Adj, -i)
## A tibble: 4 x 3
## Groups:   Journal_ref [4]
#  Journal_ref Journal_type Journal_value
#  <fct>       <fct>                <dbl>
#1 1111        Adj                     90
#2 2222        Adj                  12000
#3 3333        Rev                    500
#4 4444        Adj                   2500

另一种可能的解决方案:

Dataset %>% 
  group_by(Journal_ref) %>% 
  filter(Journal_type == c("Rev","Adj")[1 + any(Journal_type == "Adj")]) %>% 
  slice(n())

给出:

# A tibble: 4 x 3
# Groups:   Journal_ref [4]
  Journal_ref Journal_type Journal_value
  <fct>       <fct>                <dbl>
1 1111        Adj                     90
2 2222        Adj                  12000
3 3333        Rev                    500
4 4444        Adj                   2500

这是做什么的:

  • 您按 Journal_ref
  • 分组
  • 然后您过滤 Journal_type 仅当 Adj 存在时过滤 Rev 当组中没有 Adj 时。使用 c("Rev","Adj")[1 + any(Journal_type == "Adj")] 会在组中至少有一个时给你 Adj,当组中没有 Adj 时它会给出 Rev
  • 最后使用use slice(n()) to select每组的最后一行。

你也可以用 if_else:

Dataset %>% 
  group_by(Journal_ref) %>% 
  filter(Journal_type == if_else(any(Journal_type == "Adj"), "Adj", "Rev")) %>% 
  slice(n())