2016-07-14 2 views
0

Немного сложного вопроса. Мне нужен метод, чтобы систематически группировать, упорядочивать и создавать новые строки данных. Существует три уровня стратификации (c1, c2, c3, c4) и значение «оценка» для каждой итерации стратификации. Это немного сложно сформулировать, поэтому я дам вам таблицы HAVE и WANTТаблица данных реструктуризации/ввод новых строк с пустыми значениями

Ниже приведены таблицы данных для облегчения манипуляций.

data HAVE; 
    input CLASS $ FUR_COLOR $ FAMILY $ SPECIES $ NO_IN_CAPTIVITY; 
    datalines; 
MAMMAL BLACK WHALE KILLER_WHALE 2 
MAMMAL BLACK FELINE PUMA 3 
MAMMAL BLACK APE CHIMP 5 
MAMMAL BLACK APE GORILLA 3 
MAMMAL BLACK APE BONOBO 3 
MAMMAL RED APE ORANGUTAN 2 
; 
RUN; 

data WANT; 
    input C1 $ C2 $ C3 $ C4; 
    datalines; 
MAMMAL . BLACK    . 
MAMMAL WHALE KILLER_WHALE 2 
MAMMAL . BLACK . 
MAMMAL FELINE PUMA 3 
MAMMAL . BLACK . 
MAMMAL APE CHIMP 5 
MAMMAL APE GORILLA 3 
MAMMAL APE BONOBO 3 
MAMMAL . RED . 
MAMMAL APE ORANGUTAN 2 
; 
RUN; 
+1

Я не понимаю, почему строки 'C D G 3' и' C D H 3' не имеют 'D' только грести перед ними, не могли бы вы объяснить, пожалуйста? –

+0

'CDG3' и' CDH3' обе имеют значение 'D' для' C2'. Они оба сворачиваются к 'C', который переворачивается до' D'. Чтобы контрастировать, «CEI2» разделяет значение «C» с другими упомянутыми значениями, но значение 'C' сворачивается до' E', поэтому в отличие от других он получает новую строку. –

+0

Хмм ... если бы вы придумали какой-нибудь (вербальный или псевдокодовый) алгоритм, нам было бы легче помочь вам. –

ответ

1

Как об этом?

data want; 
    set have(rename=(C2=C2_in C3=C3_in C4=C4_in SCORE=SCORE_in)); 
    by C2_in C3_in; 
    format C1-C3 $1. SCORE 3.; 

    if first.C2_in or first.C3_in then do; 
    C3 = C3_in; 
    output; 
    end; 

    C2 = C2_in; 
    C3 = C4_in; 
    SCORE = SCORE_in; 
    output; 

    drop C2_in C3_in C3_in C4_in SCORE_in; 
run; 

Resulting dataset

+0

Это похоже на работу. Если набор данных 'HAVE' не отсортирован, вы должны сделать это, прежде чем запускать свой код. Большое спасибо за настойчивость Dom.! –

+0

Да, его нужно сортировать, иначе вы получите неожиданные результаты ... Добро пожаловать, рад, что это работает для вас! –

1

Вы можете использовать PROC SQL и UNION ALL так:

PROC SQL; 

CREATE TABLE want AS 

    SELECT 
     C1, C2, C4, SCORE 
    FROM 
     have 

    UNION ALL 

    SELECT 
     C1, NULL, C3, NULL 
     /* If your version does not support NULL, use '' */ 
    FROM 
     have; 

QUIT; 

ВЫХОДНОЙ:

enter image description here

+0

Результирующая таблица не похожа на таблицу 'want' OP. Кроме того, 2' NULL' в select должен быть '' '' и '.' (если какая-либо другая версия SAS не принимает' NULL'?) –

+0

Работает на шахте - я полагаю, моя версия принимает 'NULL' ... Может быть, вы можете объяснить, как она не возвращает' want'. Я отправлю изображение того, что получаю в результате. – Nicarus

+0

Интересно ... Какую версию SAS вы используете? Я нахожусь на Desktop SAS 9.4. Что касается результатов, они не упорядочены, как в '' '' '' '' '' '' 'ы, и есть 12 строк, а не 10. –

Смежные вопросы