I want to calculate the geometrical mean of two vectors in a tibble using the tidyverse. The calculated mean should be done rowwise for the two variables. I wrote the function below to this end, and it worked, but I am just wondering how could this operation be done or written in a more efficient way of coding, with more efficient I mean less code, faster and neater. Any better ideas? Just thinking loud, can map_*() be implemented in this case? I am also aware of using rowwise() but as far as I know lately the author of the tidyverse Hadley Wickham downplayed the use of rowwise() strategically.
A minimal representative example is below:
Reprex
df <- tribble(
    ~v1, ~ v2,
    4, 5,
    NA, 7,
    2, 2,
    3, NA,
    NA, NA,
    9, 9)
Suggested function
gMean <- function (df, v1, v2){
    output <- vector ("double", nrow (df))
    for (i in 1:nrow(df)){
        output[[i]] <- case_when (!is.na(df$v1[i]) && !is.na(df$v2[i]) ~ ((df$v1[i] * df$v2[i]) ^ 0.5), 
                                  is.na (df$v1[i]) && is.na (df$v2[i]) ~ 1, 
                                  !is.na(df$v1[i]) && is.na(df$v2[i]) ~ df$v1[i], 
                                  is.na(df$v1[i]) && !is.na(df$v2[i]) ~ df$v2[i]
                                  )
    }
    output
}
output
df %>%
    gMean (v1, v2)
[1] 4.472136 7.000000 2.000000 3.000000 1.000000 9.000000
 
     
     
    