Я бы использовал функцию apply, с которой:)
Настройте наш вектор имен
person_names= names(df[,1:5]) #Presumably the column names are the names
1:5
как раз в том случае, если в вашем наборе данных есть другие столбцы, которые вы не хотите рассматривать для минимальной проверки.
Теперь мы можем использовать apply для пользовательской функции, которая возвращает имя из того столбца, который имеет наименьшее значение для каждой строки.
df$Min <- apply(df[,1:5], 1, function(x){person_names[which.min(x)]})
Наша пользовательская функция, как я уже описал, apply просто применяет функцию к каждому столбцу или строке фрейма данных или матрицы. Второй аргумент 1
указывает на строки, если бы мы хотели столбцы, мы могли бы изменить это на 2
.
which.min
просто возвращает номер элемента, где бы ни находился минимум. person_names
имеют наши имена в порядке, а which.min
возвращает число, которое указывает, какое имя имеет наименьшее значение.
Вы можете сжать все это до однострочного решения, если хотите покончить с переменной person_names
.
df$Min <- apply(df[,1:5], 1, function(x){names(df[,1:5])[which.min(x)]})
Если у вас есть только 5 столбцов с именами, отбросьте 1:5
, если у вас есть столбцы, где бы то ни было, просто замените их вектором имен или номеров ваших столбцов.
РЕДАКТИРОВАТЬ: Я видел ваш комментарий на другой ответ. Чтобы приспособиться к связям, я изменю пользовательскую функцию, чтобы она проверяла все совпадения с минимальным значением x, а затем вставлял их вместе с некоторым пользовательским разделителем. Я также изменю ваши данные, чтобы Донна и Рейчел связали во втором ряду.
df <- read.table(text = 'Amy Abe Donna Racheal Mike Min u
5 34 54 56 23 Amy 0
43 11 3 3 21 Donna 1
54 32 21 54 1 Mike 1
21 5 43 32 21 Abe 1
32 21 23 5 32 Racheal 0', header = T)
person_names <- names(df[,1:5])
df$Min <- apply(df[,1:5], 1, function(x){paste(person_names[x == min(x)],
collapse = ", ")})
> df
Amy Abe Donna Racheal Mike Min u
1 5 34 54 56 23 Amy 0
2 43 11 3 3 21 Donna, Racheal 1
3 54 32 21 54 1 Mike 1
4 21 5 43 32 21 Abe 1
5 32 21 23 5 32 Racheal 0
Я установил аргумент collapse
равным ",", который является произвольно выбранным разделителем. Вы можете настроить его так, чтобы он был просто пробелом "", точкой с запятой или чем угодно.
Опять же, это можно сжать до однострочного ответа, избавившись от отдельной строки для person_names
.