У меня есть таблица с около 1000 записей и 2000 столбцов. Я хочу классифицировать каждую строку так, чтобы всем записям с одинаковыми значениями столбцов для всех столбцов, кроме «ID», присваивался идентификатор категории. Мой окончательный ответ будет выглядеть так:Категоризировать данные без консолидации?
ID A B C ..... Category ID 1 1 0 3 1 2 2 1 3 2 3 1 0 3 1 4 2 1 3 2 5 4 5 6 3 6 4 5 6 3
, где все столбцы (кроме ID) одинаковы для идентификаторов 1,3 так что они получают тот же идентификатор категории и так далее.
Я полагаю, что моя мысль заключалась в том, чтобы просто написать SQL-запрос, который выполняет группу, на каждом отдельном столбце, кроме «ID», и назначить число каждой группе, а затем присоединиться к моей исходной таблице. Мой текущий вход - текстовый файл, и у меня есть SAS, MS Access и Excel для работы. (Я мог бы использовать proc sql из SAS).
Прежде чем идти по этому маршруту и построить весь запрос, мне просто интересно, есть ли лучший способ сделать это? Для написания запроса потребуется некоторая работа, и я даже не уверен, что было бы целесообразно присоединиться к 2000 столбцам (никогда не пробовал), поэтому я подумал, что попрошу идеи, прежде чем я перейду слишком далеко по неправильному пути ,
EDIT: Я только что понял, что мой титул на самом деле не имеет смысла. Первоначально я думал: «Есть ли способ, которым я могу группироваться и классифицировать в одно и то же время без фактической консолидации в группы?»
EDIT2: После импорта таблицы в Excel я легко мог определить, что только около 200 из 2000 столбцов действительно менялись, поэтому проблема со слишком большим количеством столбцов ушла. Для классификации, я только импортировали столбцы, которые различались, и я сделал что-то вроде следующего:
proc sql;
create table categories as
select distinct *
from inputTable;
quit;
data categories;
set categories;
categoryID = _N_;
run;
proc sql;
create table tableCategorized as
select a.ID, b.CategoryID
from inputTable as a, categories as b
where
(
a.A=b.A and
a.B=b.B and
a.C=b.C and
...
a.XYZ=b.XYZ);
;
quit;
Это была боль, чтобы создать все «=» сравнений, но я просто сделал это, используя методы работы со строками в Excel , так что это было не так уж плохо. Спасибо за все предложения.
Привет, я готов попробовать ваш ответ, но я попал в ловушку импорта файла в SAS. proc import out = inputCSV datafile = file1 dbms = CSV REPLACE; getnames = YES; datarow = 2; guessingrows = 2000; RUN; Кажется, что SAS имеет ограничение длины строки для импорта proc, потому что он продолжает вырезать строки в определенной точке. Есть ли опция lineize или lrecl для импорта proc? Я знаю, что есть один для infile, но я не могу найти ничего об этом в документации по импорту proc. – oob
Существует системный параметр - используйте «options lrecl = <ваше значение здесь>;» –
gotcha. похоже, что предел равен 32767. Все мои линии длиннее. я должен выяснить способ разделить его. – oob