2016-03-02 2 views
0

У меня есть набор лабораторных результатов. Каждой строке соответствует точка времени субъекта (например: строка 1 является субъектом № 1 при первом посещении, строка 2 является предметом № 1 при его втором посещении, ...). В каждой строке у меня есть значения 5 тестов (test1, test2, ....), и для каждого теста у меня есть в дополнение к результату два столбца опорных значений теста (нормальный низкий и высокий уровни). Я хочу перенести данные таким образом, чтобы каждая строка была одинаковой для объекта + посещение + тест, с двумя столбцами, числовым результатом и статусом (нормальным или нет). Я не смог перенести данные. Мне удалось получить все тесты в длинном формате, но я не смог сохранить контрольные значения. Как я должен это делать ? Моя альтернатива - это набор утверждений if, это будет очень долго!Транспонирование данных в SAS

+0

Пожалуйста, можете ли вы разместить некоторые данные о том, что у вас есть и что вы хотите, а также код, который вы уже пробовали. – Longfish

ответ

1

Этот вопрос был также размещен на community.sas.com. Двухэтапный процесс извлекает данные из PARAMCD (лабораторный тестовый код) и тип переменной (значения и пределы диапазона нормального диапазона) из имен. PARAMCD становится новой переменной id строки, а V L и H используются для создания новых имен переменных, когда данные снова переносятся в более или менее формат CDISC SDTM.

data A; 
    input ID Visit Group Test1 Test2 Test3 Test1_L Test1_H Test2_L Test2_H Test3_L Test3_H; 
    datalines; 
1 1 0 5 3 6.7 1 10 2 7 3 9 
1 2 0 5.5 3.8 8.7 1 10 2 7 3 6 
1 3 0 4.5 2.8 5.7 1 10 3 7 3 6 
2 1 1 5 3 6.7 1 10 2 7 3 9 
2 2 1 5.5 3.8 8.7 1 10 2 7 3 9 
2 3 1 4.5 2.8 5.7 1 10 2 7 3 9 
;;;; 
    run; 
proc print; 
    run; 
proc transpose data=a out=b; 
    by id visit group; 
    run; 
data b; 
    set b; 
    length paramcd $8 namecd $1; 
    call scan(_name_,1,p,l,'_'); 
    paramcd = substrn(_name_,p,l); 
    namecd = coalesceC(substrn(_name_,p+l+1),'V'); 
    drop p l _name_; 
    run; 
proc sort data=b; 
    by id visit group paramcd; 
    run; 
proc format; 
    value $namecd 'V'='Value' 'H'='High' 'L'='Low'; 
    run; 
proc transpose data=b out=c(drop=_name_); 
    by id visit group paramcd; 
    id namecd; 
    format namecd $namecd.; 
    var col1; 
    run; 
data c; 
    set c; 
    length RangeFL $1; 
    if  n(low,value) eq 2 and value lt low then RangeFL='L'; 
    else if n(high,value) eq 2 and value gt high then RangeFL='H'; 
    else            RangeFL='N'; 
    run; 
proc print; 
    run; 
Смежные вопросы