Вот решение Tidyverse. Трудно понять, какова структура ваших данных, но это не «аккуратно». Я предполагаю, что вы пытаетесь создать сводную таблицу. Я сталкивался с подобными проблемами прежде, когда пытался сделать то же самое. Использование функции mutate_at с case_when является одним из способов, если вы хотите включить знак%, тогда столбцы должны быть символами.
library(dplyr)
library(stringr)
a <- c("Metrics", "Number of Cats", "Number Leaving", "Number Staying", "Percent of Leavers", "Percent of Stayers")
b <- c(2016, 100, 32, 68, .32, .68)
c <- c(2017, 120, 40, 80, .33, .67)
d <- c(2018, 150, 65, 85, .43, .57)
df <- tibble(a = a ,b = b, c = c, d = d)
df %>%
mutate_at(.vars = c("b", "c", "d"), .funs = list(~case_when(a %in% c("Percent of Leavers", "Percent of Stayers") ~ str_c(round(.x*100), " %"),
TRUE ~ as.character(.x))))
#OUTPUT
a b c d
<chr> <chr> <chr> <chr>
1 Metrics 2016 2017 2018
2 Number of Cats 100 120 150
3 Number Leaving 32 40 65
4 Number Staying 68 80 85
5 Percent of Leavers 32 % 33 % 43 %
6 Percent of Stayers 68 % 67 % 57 %