Join Now

Udtræk af to tilfældige pr. gruppe til hvert sit outputdataset

by New Contributor Jakob_midspar on ‎09-28-2016 02:09 AM (333 Views)

Hej Community

 

Jeg har set mig blind på en lille udfrodring jeg har fået.

Jeg har et dataset, der består af to variable: et gruppenr og en tekstkolonne. Eks:

 

Gruppe     Tekst

1               navn1

1               navn2

1               navn3

1               navn4

2               navn5

2               navn6

2               navn7

2               navn8

3... osv.

 

Jeg skal udtrække 2 tilfældige navne fra hver gruppe og outputte til et nyt dataset pr. gruppe. Mit input dataset har ca 4.500 rækker med 20 forskellige grupper.

 

Jeg anvender Entreprise Guide v. 7.12 HF4.

 

Er der nogen som har et godt forslag?

 

Mvh.

Jakob

Comments
by Occasional Contributor JanNeergaard
on ‎09-28-2016 02:25 AM
Hej Jakob



Rent metodisk ville jeg tilføje en ekstra kolonne i dit datasæt hvor du bruger RAND funktionen til at tildele tilfældige numre til hver rækken TILFÆLDIG efter hver kørsel.



Herefter grupperer du dine data efter GRUPPE sorteret efter TILFÆLDIG med en TOP 2 visning.



Håber det gav mening rent metodisk. Du skal nok lige forske lidt i hvordan man får RAND funktionen til at virke i dit setup



MVH



Jan


by SAS Employee AllanLassen
‎09-28-2016 03:33 AM - edited ‎09-28-2016 04:23 AM

Hej Jakob,

 

Du er så heldig at der faktisk findes en skræddersyet procedure til lige præcis det du gerne vil :-)

 

Hvis du laver et stratificeret tilfældigt udtræk, og laver din gruppe som strata, får du to tilfældige repræsentanter fra hver gruppe. Hvis du ikke ønsker at se de to ekstra variable som SAS danner, som beskriver den enkelte persons sandsynlighed for at blive udtaget, samt den enkeltes vægt, kan du indkommentere koden efter out-tabellen.

 

proc surveyselect data=in out=out/*(drop=selectionprob samplingweight)*/ n=2;
    strata gruppe;
run;

Håber det løser dit problem!

 

EDIT:

Det gik lige op for mig at du gerne ville outputte til ny tabel pr gruppe. Det kan løses ret let, om end på en lidt teknisk måde. Hash-objekter er både berømte og berygtede, men giver en rigtigt god mulighed for at outputte til at antal tabeller du ikke nødvendigvis kender på forhånd, se bare her:

 

data _null_;
	set out;
	by gruppe;

	* Deklarer hash objekt;
	if _n_=1 then do;
		dcl hash h(multidata:'y');
			h.definekey('gruppe');
			h.definedata('navn');
		h.definedone();
	end;

	* Nulstil for hver ny gruppe;
	if first.gruppe then h.clear();

	* Fyld observationer i indenfor gruppen;
	h.add();

	* Når sidste person er nået, output data tabellen;
	if last.gruppe then h.output(dataset:"tabel"||strip(gruppe));
run;

Denne kode kan puttes i forlængelse af første procedure, og giver dig samme antal output tabeller, som der er grupper i input tabellen.

 

Mvh

Allan

by New Contributor Jakob_midspar
on ‎09-28-2016 05:14 AM

Hej Allan

 

Tak fordi du har taget dig tid til at svare. Din løsning er klart bedre end den jeg nåede frem til selv med lidt kodemining på Google.

Og din brug af hashobjekter er bare lige i øjet  - SUPER!

 

Mit eget forslag er lidt mere omstændelig, men jeg vil da lige dele det alligevel - kan jo være andre kan bruge koden Smiley Happy

 

/* SAS macro that duplicates the Excel RANDBETWEEN function */

%macro RandBetween(min, max);

(&min + floor((1+&max-&min)*rand("uniform")))

%mend;

 

proc sql noprint;

select count(*)

into Smiley SurprisedBSCOUNT

from Alle_m_daarlig_kuvurd;

quit;

%put Count=&OBSCOUNT.;

 

data RandInt;

set Alle_m_daarlig_kuvurd;

do i = 1;

RandNo = %RandBetween(1, &OBSCOUNT.);

output;

end;

run;

 

proc sort data= RandInt;

by Afdnr descending RandNo;

run;

 

proc rank data=RandInt out=RankOut descending;

by Afdnr;

var RandNo;

ranks R_RandNo;

run;

 

proc sort data=RankOut out=RankTwos;

by Afdnr R_RandNo;

where R_RandNo <=2;

run;