You can achieve that by grouping the data.frame first by the column you do not want the predicate to apply on
library(dplyr, warn.conflicts = FALSE)
data_frame(var1 = c("hello", 'there'),
var2 = c("1", "2"),
var3 = c("4", '5')) %>%
group_by(var1) %>%
mutate_if(is.character, as.numeric) %>%
ungroup()
#> # A tibble: 2 x 3
#> var1 var2 var3
#> <chr> <dbl> <dbl>
#> 1 hello 1 4
#> 2 there 2 5
Created on 2018-08-08 by the reprex package (v0.2.0).
Otherwise, you can use the at variant by selecting column index or names before thanks to a predicate
library(tidyverse)
df <- data_frame(var1 = c("hello", 'there'),
var2 = c("1", "2"),
var3 = c("4", '5'))
to_keep <- df %>%
select(-var1) %>%
map_lgl(is.character) %>%
names
df %>%
mutate_at(to_keep, as.numeric)
#> Warning: le package 'bindrcpp' a été compilé avec la version R 3.4.4
#> # A tibble: 2 x 3
#> var1 var2 var3
#> <chr> <dbl> <dbl>
#> 1 hello 1 4
#> 2 there 2 5
Created on 2018-08-08 by the reprex package (v0.2.0).