使用 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 行:
- 其中“Adj”包含在
Journal_type
、filter/select到return最后一个“Adj[= Journal_ref
组中的 42=]" 行,并且
- 其中“Adj”未包含在
Journal_type
、filter/select 到 return 最后一个“Rev" 在 Journal_ref
组
基于上面的例子,需要的最终输出是:
Journal_ref Journal_type Journal_value
1111 Adj 90
2222 Adj 12000
3333 Rev 500
4444 Adj 2500
我尝试使用 group_by
、filter
、if
、ifelse
、grepl
、select
和 [= 的各种组合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())
我有一个类似于以下的数据集:
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 行:
- 其中“Adj”包含在
Journal_type
、filter/select到return最后一个“Adj[=Journal_ref
组中的 42=]" 行,并且 - 其中“Adj”未包含在
Journal_type
、filter/select 到 return 最后一个“Rev" 在Journal_ref
组
基于上面的例子,需要的最终输出是:
Journal_ref Journal_type Journal_value
1111 Adj 90
2222 Adj 12000
3333 Rev 500
4444 Adj 2500
我尝试使用 group_by
、filter
、if
、ifelse
、grepl
、select
和 [= 的各种组合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())