2017-02-20 1 views
3

У меня есть файл с различным количеством строк для каждого «блока», и я хотел бы, чтобы все единицы имели одинаковое количество строк, добавляя правильное количество пустых строк на единицу в данных.Как выравнивать количество строк на единицу в файле SPSS

Например:

data list list/ unit serial someData. 
begin data. 
1 1 54 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
end data. 

, что я хотел бы, чтобы добраться до это:

1 1 54 
1 2 . 
1 3 . 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
3 3 . 

Я работал с простыми обходные, например casestovars =>varstocases (держащий аннулирует) , или подготовка базового файла со всеми строками с именами и сериальными именами модулей, а затем сопоставление с файлом данных, поэтому я получаю все строки и все данные.
Может ли кто-нибудь предложить более прямой (\ элегантный \ эффективный \ простой) подход? Спасибо!

+0

Yep те способы Я тоже это сделаю. 'LOOP' и' XSAVE' - еще один вариант, хотя он не будет более эффективным. Вероятно, вы можете использовать 'AGGREGATE' и просто' VARSTOCASES' для расширения данных, но, по крайней мере, я думаю, что любой из них будет принимать от 5 до 6 строк кода. –

ответ

1

Cartesian product - вот что вам нужно здесь.

Используя ваш пример данных и загрузки Custom Extension Command, вы можете решить, как показано ниже:

data list list/ unit serial someData. 
begin data. 
1 1 54 
2 1 57 
2 2 87 
2 3 91 
3 1 17 
3 2 43 
end data. 
DATASET NAME ds0. 
DATASET ACTIVATE ds0. 
STATS CARTPROD VAR1=unit VAR2=serial /SAVE OUTFILE="C:\Temp\dsCart". 
SORT CASES BY unit serial. 
MATCH FILES FILE=* /BY unit serial /FIRST=Primary. 
SELECT IF Primary. 
MATCH FILES FILE=* /FILE=ds0 /BY unit serial /DROP=Primary. 
EXE. 

Я не уверен, насколько эффективно это Custom Extension Command поэтому вы можете экспериментировать с различными вкусами использования STATS CARTPROD. Альтернативным подходом было бы создать два набора данных (слева и справа) с вашими уникальными значениями unit и serial, а затем обработать их с помощью команды STATS CARTPROD.

+0

спасибо за ссылку, действительно я использовал это успешно - я объединил с набором данных его ключевых значений (в моих реальных данных это комбинация из четырех переменных), а другой - только с серийными номерами. Затем я получил CARTPROD из двух, которые создали набор данных, где все ключи («единицы») имеют максимальное количество строк с соответствующими серийными номерами. Соглашаясь с оригинальным файлом, я получил именно то, что хотел. 5 строк синтаксиса. МНЕ НРАВИТСЯ!! –

1

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

Так для примера вопросы вы можете создать базовые наборы данных, как это:

INPUT PROGRAM. 
LOOP #i = 1 to 3. /* 3 = maximum value of unit. 
    LOOP # = 1 to 3. /* 3 = maximum value of serial. 
     COMPUTE unit = #i. 
     COMPUTE serial = #j. 
     END CASE. 
    END LOOP. 
END LOOP. 
END FILE. 
END INPUT PROGRAM. 
DATASET NAME base. 
EXECUTE. 

Набор данных будет выглядеть следующим образом.

unit serial 
1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 

Следующая команда совпадающих файлов принесет желаемый результат.

MATCH FILES 
    /FILE base 
    /FILE data1 
    /BY unit serial. 

Если вы хотите, чтобы код более гибким относительно максимального значения «единицы» и «последовательный» вы можете использовать расширения Python:

BEGIN PROGRAM. 
import spss, spssdata 

# list of variable names 
variables = ["unit", "serial"] 

#fetch variable data 
data = spssdata.Spssdata(variables).fetchall() 

# get maximum of 'unit' and 'serial' 
maxunit = max([int(i[0]) for i in data]) 
maxserial = max([int(i[1]) for i in data]) 

# create base data set 
spss.Submit(''' 
INPUT PROGRAM. 
LOOP #i = 1 to {maxu}. 
    LOOP #j = 1 to {maxs}. 
     COMPUTE unit = #i. 
     COMPUTE serial = #j. 
     END CASE. 
    END LOOP. 
END LOOP. 
END FILE. 
END INPUT PROGRAM. 
DATASET NAME base. 
EXECUTE. 
'''.format(maxu=maxunit, maxs=maxserial)) 
END PROGRAM. 
+0

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

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