Veja que exercício de lógica interessante:
Pense em uma base com clientes que possuem vários carros. Você tem linhas contendo o nome do cliente, o nome do carro que ele possui e a data de compra do veículo. Você precisa descobrir quais clientes possuem apenas um carro. A que eu vou demonstrar talvez não seja a mais eficiente, até porque eu precisei de alguns dados ao longo do estudo, como por exemplo qual a ordem em que o veículo foi comprado. Sem isso, não sei se eu teria pensado de outra forma. O legal da forma que foi feito o tratamento é que trabalha o raciocínio lógico e ainda apresenta alguns algoritmos úteis.
O passo a passo utilizado é o seguinte: ordene seus dados pelo nome e data de compra do veículo; crie um contador para representar se é o primeiro carro que aparece do cliente; crie uma coluna adicional para saber qual o contador da linha seguinte. Veja que se você tiver na linha 10 o valor 1 no contador, e na linha 11 você tiver o valor 2, é sinal de que o cliente possui pelo menos dois veículos. No entanto, se você tiver o valor 1 no contador da linha 10 e o valor 1 no contador da linha 11, o seu cliente da linha 10 possui apenas 1 carro.
Foi falado um pouco sobra a função lag() do SAS no post Média Móvel (Bônus: Código SAS e função lag). Ela simplesmente pega o valor da linha de cima da coluna que você quer. Por exemplo, se eu fizer lag(conta_carro), eu vou saber qual o valor da coluna conta_carro da linha anterior a que estou verificando. No caso apresentado nesse post, precisamos de uma função que faça o contrário da lag, ao invés de retornar o valor da linha anterior, deve retornar o valor da linha seguinte. Você verá que não existe uma função pronta para esse caso, mas o script é bem simples e se encontra na Parte 5 do código abaixo.
**** Parte 1: Cria uma base de clientes ****; data base_clientes; input nome $ carro $ DtCompra mmddyy8.; cards; Andre Onix 02/05/15 Andre Palio 12/10/13 Andre Uno 01/05/14 Paulo Idea 10/06/15 Jose Vectra 01/04/16 Jose Eco 12/05/16 28 Maria Corsa 10/25/14 Maria Celta 02/01/16 Renata Onix 02/09/12 Renata Palio 06/05/11 Renata Fit 02/11/16 Renata Civic 05/22/14 Michael Fit 07/13/15 Bianca Clio 09/05/15 Thais March 08/05/16 Renan Palio 11/05/13 Renan Gol 11/05/14 ; run; **** Parte 2: Trata a variavel data ****; data base_clientes_v2; set base_clientes; format DtCompra date9.; run; **** Parte 3: Ordena pelo nome do cliente e data da compra do veiculo ****; proc sort data= base_clientes_v2; by nome DtCompra; run; **** Parte 4: Cria um contador do numero de carros = conta qtas vezes o nome aparece****; data base_clientes_v3; set base_clientes_v2; by nome; primeiro = first.nome; ultimo = last.nome; if primeiro = 1 then conta_carro = 1; else conta_carro+1; run; **** Parte 5: Cria uma coluna com o valor da linha seguinte da coluna conta_carro ****; data base_clientes_v4; recno=_n_+1; set base_clientes_v3 end=last; if not last then set base_clientes_v3 (keep=conta_carro rename=(conta_carro=next_conta_carro)) point=recno; else call missing(next_conta_carro); run; **** Parte 6: Mantem apenas quem tem conta_carro = 1 e que a proxima linha eh 1 tb ****; data clientes_com_um_carro; set base_clientes_v4; if conta_carro = 1 and next_conta_carro = 1; run;
Olá, como vai?
gostaria de saber qual a sintaxe utilizar para transformação de dados. Gerencio um banco de dados de animais com seus pai e suas mães, e gostaria de vez de constar o nome/registro desses animais estivesse aparecendo seus id.
ex.
id animal pai mae
1 verson 0 0
2 clara 0 0
3 hendra verson clara
como eu gostaria que ficasse
animal pai mae
1 0 0
2 0 0
3 1 2
qual o procedimento mais adequado para esse caso?
Ah me desculpe. Falei besteira. Você quer renomear a coluna 1 e “derrubar” a coluna 2. O que você vai fazer vai ser data tabela_nova; set tabela_velha (drop=animal); rename id = animal; run;