我可以使用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