Sas изменить формат столбца
Я работаю в SAS и хочу изменить тип и формат нескольких столбцов. Например, некоторые я хочу преобразовать в числовую переменную с длиной формата 3, а другие - в символьную переменную с длиной формата 41.
В настоящее время я создаю столбец и указываю желаемый формат. Затем я копирую данные из исходного столбца в новый столбец, чтобы он принял новый формат.
Вот код:
Кто-нибудь знает более эффективный способ форматирования столбцов.
Не могли бы вы добавить к своему вопросу результат работы Proc CONTENTS data=Temp.MstCause order=varnum ? Похоже, вы выполняете преобразование типов, используя неявное преобразование типов во время присвоения значения. В чем причина такого преобразования типа? Форматы - это рецепт для создания представления значения на выходе. «Преобразование» - это чаще термин для изменения базового типа значения. Число длиной 3 - это количество байтов, используемых для хранения числа в виде представления с плавающей запятой IEEE на диске. Является ли длина «3» в вопросе форматом переменных?
Вы меняете типы (числовые на char) или просто форматы, скажем, с 8 до 4 долларов? Форматы и типы разные, и вы будете использовать разные подходы.
Спасибо, ребята, что обратили мое внимание на разницу между форматом и типами. Ричард: Я меняю формат и типы, чтобы они соответствовали предыдущим данным. Недавно данные были перемещены из хранилища SAS в Sql, что изменило формат. Я не могу контролировать, как это сделать. Для простоты я просто хочу создать код, который гарантирует, что формат и тип новых данных такие же, как и у старых.
2 ответа
Самый быстрый способ - это обычно proc datasets , например:
Вы также можете применять форматы в момент обработки данных, например путем добавления оператора формата в proc means или какой-либо другой статистический процесс.
Если вы изменяете тип или длину переменной, а не только применяемый формат, вы должны использовать шаг данных и назначение. Однако вам не нужно использовать два шага с данными, в этом нет необходимости; и вы можете использовать представление шага данных, если это промежуточный шаг (т. е. это не окончательный файл результатов).
Обычно я это делаю так:
Если вы меняете только формат , а не длину , вы можете сделать это в proc datasets . Он может изменить практически любые метаданные набора данных, но не может изменить фактическую сохраненную длину (что требует перезаписи всего набора данных). Я сомневаюсь, что это то, что вы делаете в приведенном выше примере (поскольку вы используете формат по умолчанию и увеличиваете его); вы, вероятно, меняете длину .
Обратите внимание, что длина для символьной переменной - это количество символов, которые могут быть сохранены; в то время как формат контролирует то, как он отображается на экране (но не то, что сохраняется). Применение формата к предыдущей необъявленной переменной установит ее длину равной длине формата, но длина и формат - это две в основном не связанные между собой вещи.
Я не могу понять, как изменить формат столбца в моем файле данных. У меня есть импортированный набор данных, и он угадал формат определенного столбца как числовой, я хотел бы, чтобы он был основан на символах.
Это то, где я сейчас нахожусь, и это не меняет формат моего столбца NUMBER:
Обратите внимание, что нет необходимости использовать PROC IMPORT для текстового файла. Просто напишите свой собственный шаг данных, чтобы прочитать его.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 3
Вы можете импортировать данные, а затем отформатировать после использования - я считаю, что сработает следующее.
будет ли это работать так же в соединении? Кажется, у меня все еще есть проблемы с этим: x left join y on put(x.number, 4.) = y.number
Сначала сделал эту часть, а потом объединил в отдельную таблицу. Спасибо!
Вы не можете изменить тип/формат через PROC IMPORT. Однако вы можете написать шаг данных для чтения в файле, а затем все настроить. Если вы не знаете, как начать с этого, проверьте журнал после запуска PROC IMPORT, и он будет иметь «скелетный» код. Вы можете скопировать этот код, отредактировать его и запустить, чтобы получить то, что вам нужно. Запись с нуля также работает с использованием операторов INFILE и INPUT.
Из файла справки (ищите «Обработка файлов с разделителями в SAS»)
If you need to revise your code after the procedure runs, issue the RECALL command (or press F4) to the generated DATA step. At this point, you can add or remove options from the INFILE statement and customize the INFORMAT, FORMAT, and INPUT statements to your data.
Конечно, грамматика в этом разделе ужасна! Идея состоит в том, что IMPORT Процедура генерирует исходный код, который можно вызвать и изменить для последующей отправки.
Другие вопросы по теме
Похожие вопросы
Есть ли способ использовать метод «read_csv» для чтения файлов csv в том порядке, в котором они перечислены в каталоге?
У меня есть три столбца с датой, отформатированной по-разному в SAS:
- 12 june 2017 00:15 - полная дата
- 2016 - только год
- 12 - всего месяц
Мне нужно изменить формат даты и вычесть после дат, чтобы получить результаты в количестве месяцев.
например, "12 June 2017 00:15" - December 2016 = 7
как это сделать?
Вы говорите о необработанном файле данных или наборе данных SAS? Могут ли какие-либо из этих переменных строки символов вместо чисел? Является ли первая числовой переменной с допустимым значением даты и времени SAS? Если это так, на самом деле нет формата, который отображал бы его в точности так, как вы показываете. Вы спрашиваете, как преобразовать (1) и (2 и 3 вместе) в значения даты?
Это набор данных Sas. Первый столбец - это формат даты, второй и третий - числовые.
Первое не похоже на свидание. Похоже на дату и время, поскольку у него есть компонент времени.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 3
Как вы, вероятно, уже обнаружили, не существует готового Информация о дате SAS, который правильно обрабатывал бы ваше полное поле даты, поэтому вам нужно будет написать немного пользовательской логики для его преобразования перед выполнением ваших вычислений. date9. - самый близкий подходящий формат, который я смог найти:
- Преобразуйте поле «полная дата» в значение даты SAS.
- Преобразуйте также комбинацию года и месяца в значение даты SAS.
- Используйте функцию INTCK, чтобы найти разницу в месяцах.
данные даты;
вход dt $ 18. гг мм;
mm_diff = intck ("пн", ввод (коты (гг, мм), ггммn6.), ввод (dt, anydtdte12.)); положить mm_diff =;
карты;
12 июня 2017 00:15 2016 12
11 июня 2018 00:15 2017 3
;
запустить ;
В журнале будет напечатано:
mm_diff = 6 mm_diff = 15
В качестве примечания: утверждение «нет готовой информации о дате SAS, которая правильно обрабатывает ваше полное поле даты», сделанное в другом месте в этом потоке, неверно. Как показано в приведенном выше фрагменте программы, ANYDTDTEw. informat справляется с этим апломбом. Просто программист должен предоставить достаточную информационную ширину W. Выше она выбрана как W = 12. Если вы не хотите гадать и / или считать, просто используйте ANYDTDTE32.
С уважением, Пол Дорфман
Большое спасибо! Это очень полезно
Предполагая, что у вас есть три числовые переменные, а первая содержит допустимые значения SAS дата и время, вы должны сначала преобразовать обе в допустимые значения SAS Дата. Затем вы можете использовать функцию INTCK () для подсчета месяцев.
Большое спасибо! Это очень полезно
Другие вопросы по теме
Похожие вопросы
'020-06-08 17: 11: 02 + 00: 00' Я хочу извлечь дату из этого формата времени в Python, используя datetime
Моя текущая проблема заключается в том, что у меня есть данные в одной таблице, а другая таблица содержит диапазоны значений для классификации каждого столбца в категорию.
Пример: Для "Город" - значение от 0 до 6 меняется на 1, 7-16 на 2 и 17+ на 3.
В конечном итоге мне придется использовать этот код в таблице из более чем 100 столбцов с 500 диапазонами/категориями значений.
У меня есть подходящий код для создания категорий и для выбора столбца за столбцом, но основной код (чтение условия и их применение) ускользает от меня.
В следующем примере код test1 содержит необработанные данные, test2 — диапазоны значений для всех столбцов, test3 — условия для выбранного столбца.
Моя идея состояла в том, чтобы использовать цикл выполнения макроса для просмотра всех категорий для каждого столбца. Вся идея работает, если я не использую макрос (что, насколько мне известно, исключает использование цикла) и вместо вызова symput использую простые уравнения (x = y) в if.
Буду очень признателен за любую помощь с макросом или предложение сделать это каким-то другим способом.
Обновлено: Итак, пытаясь использовать рекомендуемый формат proc, я столкнулся с проблемой - он работает, когда я жестко запрограммирую диапазоны и переменную/столбец для изменения, но я не знаю, как заставить его работать в случае:
А) имя столбца как содержимое макропеременной (получил ошибку, что формат либо не найден, либо неприменим)
B) диапазоны, находящиеся в наборе данных
Как я могу прочитать значения для столбца переменной, вставить его в формат, использовать его для классификации данных, а затем перезаписать его для использования в другом столбце?
Спасибо за совет и ссылку, но я все еще не могу заставить его работать. Формат Proc работает для жестко закодированных переменных + диапазонов, но мне нужно, чтобы он был гибким и перезаписывался для каждой переменной, а также нашел способ считывать диапазоны из набора данных.
Вы читали статью по ссылке? В нем есть пример создания форматов из наборов данных. Включите попытку, которую вы предприняли до сих пор.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 2
Вот как это будет работать, если вы используете форматы. При желании вы можете автоматизировать дальнейшую фактическую реализацию форматов, но вот подход, который я бы рекомендовал. Вы можете создать IF/THEN, если хотите, но мне кажется, что это намного больше работы и более привередливо.
Похоже, вы хотите использовать данные формата в TEST2 для преобразования значений в TEST1 в коды. Итак, для CITY у вас есть три уровня, поэтому вы хотите сгенерировать значения 1,2,3. Таким образом, вы можете сделать это с форматами, но если вы хотите, чтобы результаты были числами, а не строками, вам нужно будет использовать вызов функции INPUT() для преобразования отформатированного значения обратно в число.
Сначала давайте создадим пример данных, используя обычный код SAS, так как гораздо проще изменить тестовые данные, чем операторы SQL INSERT.
Мы можем преобразовать набор данных TEST2 в формат. Мы можем использовать шаг данных для создания данных, необходимых для определения форматов с использованием PROC FORMAT. Предположим, что он уже отсортирован по УСЛОВИЮ в категории, которые вы хотите создать, чтобы мы могли сгенерировать номера категорий. Также я предполагаю, что УСЛОВИЕ является допустимым именем формата (начинается с альфы или символа подчеркивания и НЕ заканчивается цифрой).
Чтобы использовать эти форматы для преобразования значений в номера категорий, нам нужно сгенерировать некоторый код. Когда список переменных достаточно мал, вы можете поместить код в одну переменную макроса (максимальная длина 64 КБ).
Например, если мы хотим сгенерировать новые переменные с суффиксом _GRP для любой переменной во входном наборе данных, TEST1 , чье имя находится в списке условий в таблице метаданных, TEST2 . Мы могли бы использовать такой код для создания макропеременной.
Для вашего примера переменная макроса RECODE выглядит так:
Который затем можно использовать на шаге даты, чтобы создать новый набор данных из старого.
Если у вас много переменных, которые вы перекодируете, то вместо создания макропеременной вы можете просто записать код в файл.
Вы также можете создать другую серию форматов, которые можно использовать для декодирования категорий обратно в описания. Таким образом, для вашей новой переменной CITY_GRP вы можете захотеть сгенерировать формат CITY_GRP. , который преобразует 1 в low - 6 и т. д.
Почему вы определили его как числовое, если хотите загрузить его символьными строками? Измените шаг, который создает таблицу, тогда шаг, который загружает в него данные, будет работать.
Стол был создан очень давно. Не могли бы вы указать мне, как это делается? Я знаю, как изменить код на то, что хочу. Как изменить формат столбца в таблице?
Итак, вы хотите кодировать свои строки в числа? Или создать новую таблицу, в которой эта переменная определена как символ? Вы не можете просто изменить тип переменной, вам нужно создать новую переменную. Объясните подробнее весь процесс, чтобы получить лучший ответ.
Итак, у вас есть таблица, которая определена в Data Integration studio (1) и создана давным-давно путем выполнения задания (2) с числовым столбцом. Назовем эту таблицу THE_TABLE этим полем the_field и заданием The_Job , которое загружает данные в THE_TABLE
Вы должны осознавать принципиальную разницу
- определение THE_TABLE в DI studio, которое создает описание таблицы в метаданных
- создание THE_TABLE путем запуска The_Job , который создает файл в папке с данными
Если The_Job действительно THE_TABLE каждый раз создается с нуля (что типично для ETL-заданий), достаточно вносить изменения THE_TABLE и The_Job в DI studio. Ваши изменения будут только изменить данные мета, но в следующий раз при запуске The_job , THE_TABLE Виль создается с правой структурой.
Однако, если он The_Job обновляется THE_TABLE или добавляется к нему, ваши правки не изменят структуру, THE_TABLE и ваше задание не будет соответствовать структуре файла, THE_TABLE как будто он все еще существует в папке, поэтому вы должны преобразовать его THE_TABLE перед запуском The_Job .
Это можно сделать с помощью простой программы вроде
Правильный оператор attrib вполне может быть в сгенерированном коде The_Job .
Имейте в виду, что при типичной настройке со средой разработки, тестирования и производства вам понадобится эта программа один раз в каждой среде.
Читайте также: