我可以使用 ' contains
' in檢查特定列是否存在dplyr
。如果它不存在,我很難評估運算式的摘要。
這是我的代碼片段:
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 列不存在,如何忽略匯總運算式中的“EUR”運算式?
uj5u.com熱心網友回復:
這樣的事情應該有效:
df <- Prod%>%
group_by(Entity)%>%
summarise(across(any_of(c('Cum.Oil', 'Cum.Gas', 'Eur')), ~mean(.x),
.names = '{.col %>% str_remove("Cum.")}' )
但是,如果沒有一些代表就無法測驗。
提示:您還可以any_of
在 select 陳述句中使用:
df <- Prod%>%
group_by(Entity)%>%
select(any_of(c('Entity', 'Cum.Oil', 'Cum.Gas', "EUR"))
uj5u.com熱心網友回復:
如果它更方便,你也可以ifelse
在 dplyr 管道中使用構造,盡管我認為@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`)
)
)
.
}
uj5u.com熱心網友回復:
Juan C 的回答是解決這個問題的方法。
但作為參考,我們可以使用它purrr::when()
來創建管道友好的條件。當我們想使用像exists()
in這樣的函式時,我們可以按如下when()
方式指定引數: .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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/535404.html
標籤:rdplyr
下一篇:在for回圈中將列名指定為標題