Другой подход может быть следующим:
df %>%
mutate(mode = max.col(.[2:length(.)])+1) %>%
rowwise() %>%
mutate(mode = names(.)[[mode]]) %>%
select(X, mode)
X mode
<int> <chr>
1 0 Totally.agree
2 1 Agree
3 2 Agree
4 3 Agree
5 4 Agree
6 5 Agree
7 6 Agree
8 7 Disagree
9 8 Disagree
10 9 Disagree
Здесь он сначала идентифицирует индекс столбца с наибольшим числом, а затем назначает имя столбца на основе индекса столбца.
И если вы хотите включить также числа, вы можете попробовать:
df %>%
mutate(mode = max.col(.[2:length(.)])+1) %>%
rowwise() %>%
mutate(mode_names = names(.)[[mode]],
mode_numbers = max(!!! rlang::syms(names(.)[2:length(.)]))) %>%
select(X, mode_names, mode_numbers)
X mode_names mode_numbers
<int> <chr> <dbl>
1 0 Totally.agree 122.
2 1 Agree 124.
3 2 Agree 119.
4 3 Agree 138.
5 4 Agree 85.
6 5 Agree 89.
7 6 Agree 94.
8 7 Disagree 98.
9 8 Disagree 102.
10 9 Disagree 96.
Или следуя своей оригинальной логике:
df %>%
gather(mode_names, mode_numbers, -X) %>%
group_by(X) %>%
filter(mode_numbers == max(mode_numbers)) %>%
arrange(X)
X mode_names mode_numbers
<int> <chr> <int>
1 0 Totally.agree 122
2 1 Agree 124
3 2 Agree 119
4 3 Agree 138
5 4 Agree 85
6 5 Agree 89
7 6 Agree 94
8 7 Disagree 98
9 8 Disagree 102
10 9 Disagree 96