2015-10-28 2 views
-3

У меня есть следующая таблица:Как найти одно значение из другого ряда

мне нужно добавить 1 в б столбце, если (когда первый 1 будет найден, то вам нужно сложить все 1 когда это условие удовлетворяется: C нравится в не поставить 0 и 2, мне нужно только 1):.

  1. найти там Ь = 1, а затем
  2. если с подобно

Это мой желаемый результат

+0

В выходных строках 15, 16 и 17 столбец c имеет значения h_2_ok, h_3 & z_1_ok, эти значения соответствуют столбцу a в строках 11 (h_2), 15 (h_3) & 10 (z_1) соответственно, поэтому в соответствии с логикой, которую вы дали этим строкам, должно быть b установлено в 1, потому что c «нравится» a. В чем логика, почему b не установлен в 1 для строк 15, 16 и 17? – Amir

+0

Поскольку 15 строк с полем «h_2_ok» и h_2 в 11 строке имеют значение 2, а 16 строк c поле «h_3», а 17 строк c поле «z_1_ok» и 10 строк - «z_1» пусто. Все, что мне нужно, захватить значение 1. –

+0

Я не понимаю логику, возможно, что-то теряется в переводе. – Amir

ответ

0

В вопросе логика дается не соответствует результат, показанный. Например, во входных данных строка 6 имеет a = y_2 и b не задана, строка 7 имеет c без значения, это означает, что вывод должен иметь b = 0, но на вашем выходе отображается b = 1.

Насколько я понимаю, логика вы хотите либо:

1) В вашей продукции вы хотите б = 1 исходя из условия , если б = 1 или (значение а = значение с в следующей строке)

или

2) в вашей продукции вы хотите б = 1 на основании состояния , если значение а = значение с в следующей строке (игнорируя входное значение б)

Основываясь на этих двух логических сценариев, мои две альтернативные решения использовать данные, которые вы показали, установить следующим образом:

data have; 
    input @1 a $char3. 
     @5 b 
     @7 c $char3. 
    ; 
    datalines; 
x_0 1 
x_1 . x_0 
x_2 . x_1 
x_3 . x_2 
y_1 1 
y_2 . y_1 
y_3 0 
z_1 . 
; 

Решение 1

в вашем выходе, если вы хотите б = 1 исходя из условия , если б = 1 или (значение а = значение с в следующей строке) попробуйте:

data want(drop=c2); 
    merge have 
     have(drop=a rename=c=c2 firstobs=2); 

    b=(b or (a=c2)); /* the brackets are for clarity */ 
run; 

Это дает выход:

Obs a b c 
1 x_0 1  
2 x_1 1 x_0 
3 x_2 1 x_1 
4 x_3 1 x_2 
5 y_1 1  
6 y_2 0 y_1 
7 y_3 0  
8 z_1 0  

Альтернативно

Решение 2

В вашем выходе, если вы хотите б = 1 на основании состояния , если значение a = значение c в следующей строке (игнорируя входное значение b), затем попробуйте:

data want(drop=c2); 
    merge have 
     have(drop=a rename=c=c2 firstobs=2); 

    b=(a=c2); /* the brackets are for clarity */ 
run; 

Это дает выход:

Obs a b c 
1 x_0 1  
2 x_1 1 x_0 
3 x_2 1 x_1 
4 x_3 0 x_2 
5 y_1 1  
6 y_2 0 y_1 
7 y_3 0  
8 z_1 0  

Если ни один из них дают свой желаемый результат, то я предлагаю вам посоветовать, какие строки являются неправильными и то, что логика должна быть, также добавить логическое пояснение к вопрос.

С уважением, Амир.

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