Предположим, у меня есть набор данных have
, который содержит взаимные корреляции (полученные из результатов процедуры proc corr):
_NAME_ A B C
A 1 0.2 0.8
B 0.2 1 0.3
C 0.8 0.3 1
Я пытаюсь вычислить наибольшее значение корреляции
data want;
set have;
max_corr = max(of A B C);
run;
Что производит:
_NAME_ A B C max_corr
A 1 0.2 0.8 1
B 0.2 1 0.3 1
C 0.8 0.3 1 1
Однако это значение равно 1 для каждой строки, что и ожидается, поскольку корреляция по диагонали равна 1. Как настроить код, чтобы отображать наибольшую корреляцию, не равную 1?
Например, я ищу
_NAME_ A B C max_corr
A 1 0.2 0.8 0.8
B 0.2 1 0.3 0.3
C 0.8 0.3 1 0.8
какой результат вы хотите показать? пожалуйста, приведите пример
@BusraEcemSakar — я добавил пример того, что хочу показать.
@jarlh - я добавил пример ожидаемых результатов. Имена столбцов и значения имен в наборе данных одинаковы, поскольку это результат взаимной корреляции в SAS. Он был сгенерирован на основе базовых данных proc corr data = input_data out=have (where=(_TYPE_ = "CORR")); var A B C; run;
спасибо за ваш пример, я опубликовал свой ответ.
Кажется, это не связано с SQL, поэтому я удаляю этот тег.
Вы можете использовать оператор if, вот код
data want;
set have;
/* Initialize max_corr as missing */
max_corr = .;
/* Compare each correlation and ignore the diagonal (where value = 1) */
if A < 1 then max_corr = max(max_corr, A);
if B < 1 then max_corr = max(max_corr, B);
if C < 1 then max_corr = max(max_corr, C);
run;
Кажется, вам просто нужно второе по величине значение?
data have;
input _NAME_ $ A B C;
datalines;
A 1 0.2 0.8
B 0.2 1 0.3
C 0.8 0.3 1
;
data want;
set have;
max_corr = largest(2, of A--C);
run;
Вы можете использовать самую большую функцию.
data corr;
input _NAME_ $ A B C;
max_corr = largest(2,of a b c);
cards;
A 1 0.2 0.8
B 0.2 1 0.3
C 0.8 0.3 1
;;;;
run;
proc print;
run;
Я подозреваю, что на самом деле вам нужна наибольшая корреляция, кроме внутренней корреляции (которая всегда равна 1).
В этом случае используйте МАССИВ и уберите диагональное значение. Вы всегда можете вернуть 1 после нахождения МАКС.
data corr;
input _NAME_ $ A B C ;
cards;
A 1 0.2 0.8
B 0.2 1 0.3
C 0.8 0.3 1
;;;;
data want;
set corr;
array _num_ _numeric_;
_num_[_n_]=.;
max_corr = max(of _num_[*]);
length max_corr_var $32;
max_corr_var = vname(_num_[whichn(max_corr,of _num_[*])]);
_num_[_n_]=1;
run;
Результат
max_
Obs _NAME_ A B C max_corr corr_var
1 A 1.0 0.2 0.8 0.8 C
2 B 0.2 1.0 0.3 0.3 C
3 C 0.8 0.3 1.0 0.8 A
Предложение по улучшению вопроса: не используйте A, B и C как имена столбцов, так и значения имен. Также укажите ожидаемый результат, т. е. приведите минимально воспроизводимый пример .