Home > Mobile >  how to add condition to mutate(across
how to add condition to mutate(across

Time:02-17

I have df and I would like to calculate percentage (.x/.x[1] * 100 ) when row_number >2 and the first row in the same col is not 0. What should I do if we want to use mutate(across...? where and how can I add the part on .x[1]!=0?

mutate(across(.fns = ~ifelse(row_number() > 2 ... sprintf("%1.0f (%.2f%%)", .x, .x/.x[1] * 100), .x)))

df<-structure(list(Total = c(4, 2, 1, 1, 0, 0), `ELA` = c(0, 
0, 0, 0, 0, 0), `Math` = c(4, 2, 1, 1, 0, 
0), `PE` = c(0, 0, 0, 0, 0, 0)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

CodePudding user response:

df %>% 
  mutate(across(
    where(~.x[1] > 0),
    ~ifelse(
      row_number() > 2,
      sprintf("%1.0f (%.2f%%)", .x, .x/.x[1] * 100),
      .x
    )))
# # A tibble: 6 × 4
#   Total        ELA Math          PE
#   <chr>      <dbl> <chr>      <dbl>
# 1 4              0 4              0
# 2 2              0 2              0
# 3 1 (25.00%)     0 1 (25.00%)     0
# 4 1 (25.00%)     0 1 (25.00%)     0
# 5 0 (0.00%)      0 0 (0.00%)      0
# 6 0 (0.00%)      0 0 (0.00%)      0

Have a look at the ?across help page for more examples.

  •  Tags:  
  • r
  • Related