r-Dplyr-如果列存在,则选择此项,如果确实存在,则进行汇总

  • 本文关键字:如果 存在 选择 r-Dplyr- r dplyr
  • 更新时间 :
  • 英文 :


我可以使用dplyr中的"contains"检查特定列是否存在。如果表达式的摘要不存在,我很难对其进行评估。

这是我的代码片段:

df <- Prod%>%
group_by(Entity)%>%
select(Entity,`Cum.Oil`,`Cum.Gas`,contains("EUR")%>%
summarise(Oil = mean(`Cum.Oil`), Gas = mean(`Cum.Gas`), EUR=mean(EUR))

如果EUR列不存在,我如何忽略summary表达式中的"EUR"表达式?

这样的东西应该可以工作:

df <- Prod%>%
group_by(Entity)%>%
summarise(across(any_of(c('Cum.Oil', 'Cum.Gas', 'Eur')), ~mean(.x), 
.names = '{.col %>% str_remove("Cum.")}' )

不过,没有一些reprex就无法进行测试。

提示:您也可以在select语句中使用any_of

df <- Prod%>%
group_by(Entity)%>%
select(any_of(c('Entity', 'Cum.Oil', 'Cum.Gas', "EUR"))

如果更方便的话,你也可以在dplyr管道中使用ifelse结构,尽管我认为@Juan的回答更优雅:

Prod <- data.frame(Entity = c("a", "b", "a"),`Cum.Oil` = 1:3,`Cum.Gas`=c(2,4,6)
, EUR = c(7,9,9)
)
Prod %>% 
group_by(Entity) %>% {
ifelse(exists("EUR", .), 
. <- summarise(., Oil = mean(`Cum.Oil`), 
Gas = mean(`Cum.Gas`), 
EUR = mean(EUR)
), 
. <- summarise(., Oil = mean(`Cum.Oil`), 
Gas = mean(`Cum.Gas`)
)
)  
.
} 

Juan C的答案就是解决这个问题的方法。

但作为参考,我们可以使用purrr::when()来创建管道友好条件。当我们想在when()中使用类似exists()的函数时,我们可以指定envir参数如下:exists("EUR", envir = as.environment(.))

library(tidyverse)
Prod <- data.frame(Entity = c("a", "b", "a"),
`Cum.Oil` = 1:3,
`Cum.Gas`=c(2,4,6),
EUR = c(7,9,9))
Prod %>%
group_by(Entity)%>%
select(Entity,`Cum.Oil`,`Cum.Gas`, contains("EUR")) %>%

when(exists("EUR", envir = as.environment(.)) ~ 
summarise(., Oil = mean(`Cum.Oil`), Gas = mean(`Cum.Gas`), EUR=mean(EUR)),

TRUE ~
summarise(., Oil = mean(`Cum.Oil`), Gas = mean(`Cum.Gas`))
)
#> # A tibble: 2 × 4
#>   Entity   Oil   Gas   EUR
#>   <chr>  <dbl> <dbl> <dbl>
#> 1 a          2     4     8
#> 2 b          2     4     9

创建于2022-11-16,reprex v2.0.2

最新更新