I have such a data frame:
dat <- data.frame(var1 = rnorm(10), var2 = rnorm(10), var3 = rnorm(10), var4 = rnorm(10))
> dat
var1 var2 var3 var4
1 -1.3784414 1.06816022 1.46578217 -0.4141153
2 -0.3272332 -0.69470574 0.02220395 -0.5502878
3 0.2559891 -0.06964848 -0.34745180 0.6399705
4 0.6029044 1.23680560 -0.72392358 -0.1990832
5 1.3097174 -0.58028595 -0.01487186 -0.8765290
6 -1.2356668 0.41330063 -1.00375989 -1.1974204
7 -0.4126320 3.83320678 -1.42059022 -0.6747575
8 1.7339653 0.58610348 0.40200428 1.4582103
9 1.2994859 1.65355306 0.75985071 0.6455882
10 -0.2353356 2.04468739 -0.11521602 0.3251901
The aim is to create a new column with the name of the column that contains the maximum value in each row within columns var2, var3 and var4.
Using the following command does not result in the correct output:
library(dplyr)
dat %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 5
# Rowwise:
var1 var2 var3 var4 var.max
<dbl> <dbl> <dbl> <dbl> <chr>
1 -1.38 1.07 1.47 -0.414 var2
2 -0.327 -0.695 0.0222 -0.550 var2
3 0.256 -0.0696 -0.347 0.640 var3
4 0.603 1.24 -0.724 -0.199 var1
5 1.31 -0.580 -0.0149 -0.877 var2
6 -1.24 0.413 -1.00 -1.20 var1
7 -0.413 3.83 -1.42 -0.675 var1
8 1.73 0.586 0.402 1.46 var3
9 1.30 1.65 0.760 0.646 var1
10 -0.235 2.04 -0.115 0.325 var1
But if the column var1 is excluded from the data it works:
dat %>%
select(-var1) %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 4
# Rowwise:
var2 var3 var4 var.max
<dbl> <dbl> <dbl> <chr>
1 1.07 1.47 -0.414 var3
2 -0.695 0.0222 -0.550 var3
3 -0.0696 -0.347 0.640 var4
4 1.24 -0.724 -0.199 var2
5 -0.580 -0.0149 -0.877 var3
6 0.413 -1.00 -1.20 var2
7 3.83 -1.42 -0.675 var2
8 0.586 0.402 1.46 var4
9 1.65 0.760 0.646 var2
10 2.04 -0.115 0.325 var2
.. just like when var1 is at the last position:
dat %>%
select(var2, var3, var4, var1) %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 5
# Rowwise:
var2 var3 var4 var1 var.max
<dbl> <dbl> <dbl> <dbl> <chr>
1 1.07 1.47 -0.414 -1.38 var3
2 -0.695 0.0222 -0.550 -0.327 var3
3 -0.0696 -0.347 0.640 0.256 var4
4 1.24 -0.724 -0.199 0.603 var2
5 -0.580 -0.0149 -0.877 1.31 var3
6 0.413 -1.00 -1.20 -1.24 var2
7 3.83 -1.42 -0.675 -0.413 var2
8 0.586 0.402 1.46 1.73 var4
9 1.65 0.760 0.646 1.30 var2
10 2.04 -0.115 0.325 -0.235 var2
What am I missing here?