2017-02-19 1 views
1

Мои данные содержат странно введенные данные. Мне нужно разбить строку, которая может состоять из 1-2-значного возраста или двух возрастов, разделенных запятой или периодом. Запятая обозначает постоянное воздействие, а период представляет собой отдельный инцидент.SPSS: как закодировать макрос (цикл и т. Д.), Который использует несколько «вычислений» (Char.Substr и Char.Index) для нескольких переменных. (5-6 выходов на Var (29))

У меня есть базовый код для применения к одной переменной, но я просто инвестирую 2-3 часа, пытаясь автоматизировать, поэтому мы можем изменить его на одну строку, а не на код в 29 раз отдельно. Подумал, что это будет легко, но я возился с петлями и «!». слишком долго на этом этапе. Любые рекомендации будут оценены.

Если это помогает, существующий код находится ниже.

**Split Ages and Determine Continuous or Intermittent. 
*ID position of comma and period. 
Compute Period = CHAR.INDEX (Var, "."). 
Execute. 

Compute Comma = CHAR.INDEX (Var, ","). 
Execute. 

*Seperate ages into seperate variables. 
STRING Age1(A2) Age2(A2). 

DO IF (Comma = 2 or Period=2). 
COMPUTE Age1 = CHAR.SUBSTR (Var,1,1). 
COMPUTE Age2 = CHAR.SUBSTR (Var,3). 

ELSE IF (Comma = 3 or Period=3). 
COMPUTE Age1 = CHAR.SUBSTR (Var,1,2). 
COMPUTE Age2 = CHAR.SUBSTR (Var,4). 

ELSE IF (Comma = 0 and Period = .00). 
COMPUTE Age1 = Var. 
END IF. 

*Convert String to Numeric. 
alter type Age1(f2). 
alter type Age2(f2). 
execute. 

*Cont or Int. 
DO IF (Period >0). 
Compute Multiple = 1. 
END IF. 

DO IF (Comma >0). 
Compute Duration = Age2 - Age1. 
END IF. 


EXECUTE. 
+0

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

ответ

1

Гораздо более простой способ сделать это с фрагментом кода Python и командой расширения SPSSINC TRANS, который обычно устанавливается вместе с статистикой.

Некоторые данные:
список данных/возраст (a5).
начинаются данные
22,23
22,23
конечные данные.

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

spssinc trans result=part1 part2 type=2 
/formula "re.split('[.,]',age)". 

Если вы хотите узнать больше об использовании Python с статистики, скачать Программирование и книги Управление данными с веб-сайта SPSS сообщества. https://developer.ibm.com/predictiveanalytics/docs/spss-statistics/programming-and-data-management-book/

0

То, что я разместил вчера, показывает, как легко разделить одну переменную. Вот как это сделать, чтобы разбить весь список переменных за один проход. Я проиллюстрирую только две возрастные переменные.

Во-первых, вы определяете функцию расщепления, которая может перебирать несколько переменных.

begin program. 
import re 
def splitter(*x): 
    # x is a list of values to split 
    result = [] 
    for item in x: 
     splits = re.split("[.,]", item) 
     if len(splits) == 1: 
      splits.append("") 
     result.extend(splits) 
    return(result) 
end program. 

Затем вы указываете команду SPSSINC TRANS со всеми возрастными переменными. В этом примере я использую TO для ссылки на список смежных переменных, но вы можете также перечислить все имена отдельных переменных.

Список переменных результатов использует TO и задает в два раза больше переменных, чем вход. Опять же, вы можете при необходимости указать список переменных.

spssinc trans result=part1 to part4 type=2 
/variables age to age2 
/formula "splitter(<>)". 

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

p.s. Если вы хотите, чтобы переменные результата были численными, а не строками, вы можете изменить тип от 2 до 0. Это приведет к тому, что вторая переменная в паре не будет отсутствовать, если на ее входе не было периода или запятой.

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