SAS DATA Step Merge A Powerful Tool Dalia C. Kahane, Westat, Rockville, MD
|
|
- Hannah Opal Gordon
- 7 years ago
- Views:
Transcription
1 SAS DATA Step Merge A Powerful Tool Dalia C. Kahane, Westat, Rockville, MD ABSTRACT Through the DATA Step Merge, SAS offers you a method by which you may join two or more datasets and output a combined product. This is a truly powerful tool. If you follow some important basic rules you will find that you may accomplish many tasks, such as: adding summary national data to individual educational data to compare individual performances to national averages, adding sales to customer data, etc. The DATA step Merge is similar, but not identical, to a Join operation in PROC SQL. The advantages of mastering the Merge is that you are totally in charge and that you may see explicitly what happens behind the scenes. As a matter of fact, you may use the DATA step Merge to test if results achieved by other methods are accurate. Like all powerful tools, you need to know how to use it; how to take advantage of the power without making mistakes. This paper explores the strengths inherent in the Merge and gives you suggestions on how to avoid possible pitfalls. It is a must for beginners and yet includes tips for experienced programmers too. INTRODUCTION The SAS documentation describes the DATA step Merge in the following way: The MERGE statement joins corresponding observations from two or more SAS data sets into single observations in a new SAS data set. The way the SAS system joins the observations depends on whether a BY statement accompanies the MERGE statement 1 Why does SAS offer this tool? Here are some every day examples of why you might want to combine data: Educational data about students appear in multiple files, one per class (e.g. Math, English, etc.); you want to combine the data to show a student s performance across all classes; you may also then get the average performance per student across all classes Your client wants to see educational performance data where you need to combine teachers data with that of their students You have research data about physicians and you want to compare individual against national or regional averages; combining individual data with summary data You have two datasets: one which contains data from parents and another which contains data from children; you want to combine them; parents may have multiple children and vice versa These examples illustrate that there are different types of merges (one-to-one, one-to-many and many-to-many). This paper explores the rules to follow in order to perform these varying types of merges and points out the importance of using an accompanying BY statement. Also, since by default, SAS keeps all the observations and all the variables that belong to all the datasets being joined, you need to carefully trim the incoming datasets, so that the combined product will reflect exactly what you want, not what automatically happens due to the SAS program data vector (PDV) rules. This paper demonstrates the use of the SAS DATA Step options such as the DROP=, KEEP=, and RENAME=, which help you take control of variables, and the WHERE= and subsetting IF, which help you take control of the observations to be included in the merge. All the examples used in this paper limit the merge to two source datasets, so that the rules can be more easily demonstrated. Also, in order to keep things simple, the examples are about toys and children with very few observations in each dataset/table. 1
2 DATASETS USED TO ILLUSTRATE COMBINING OF DATA The datasets that will be used as examples for the purpose of discussing the Merge and Join actions include the following: Toy dataset includes the code, description and company code for various toys Code Description CompanyCode 1202 Princess Baby Doll Animal Set Model Train Electric Truck Animal Cards Teddy Bear 2000 ToyGenderAge provides associated gender and recommended-age information for each toy Code Gender AgeRangeLow AgeRangeHigh 1202 F F B M M M 2 6 Company provides the company code and name for toy manufacturers CompanyCode CompanyName 1000 Kids Toys 2000 More Toys Factory provides data on all factories associated with each company Company Code FactoryCode FactoryState MD NY VT AZ ME CA 2
3 THE BASICS OF PERFORMING THE DATA STEP MERGE As described above, the SAS Merge allows the programmer to combine data from multiple datasets. Each observation from dataset one is combined with a corresponding observation in dataset two (and dataset three, etc.) 1 The observations and data fields from the source datasets that will be included in the resulting dataset are determined by the detailed instructions provided by the programmer. DEFAULT MERGE: ONE-TO-ONE NO MATCHING The default action taken by SAS when the code requests a merge between two datasets is to simply combine the observations one by one in the order that they appear in the datasets. data Merged_ToyGA_default; merge Toy ToyGenderAge; INFO: The variable Code on data set WORK.TOY will be overwritten by data set WORK.TOYGENDERAGE. NOTE: There were 7 observations read from the data set WORK.TOY. NOTE: There were 6 observations read from the data set WORK.TOYGENDERAGE. NOTE: The data set WORK.MERGED_TOYGA_DEFAULT has 7 observations and 6 variables. Code Description CompanyCode Gender RangeAgeLow RangeAgeHigh 1202 Princess 1000 F Baby Doll 1000 F Animal Set 1000 B Model Train 1000 M Electric Truck 1000 M Animal Cards 2000 M Teddy Bear By default the SAS Merge does the following: combines in order observation #1 from Toy with Observation #1 from ToyGenderAge, then Observation #2 with Observation #2, etc.; does not try to match on common variable(s); simply matches the observations in the random order that they appear in the datasets keeps all observations from both datasets the system option MergeNoBy is set to NOWARN; neither a warning nor an error message is given to alert user that a merge is being performed without matching observations through a BY statement in a one-to-one merge, common variables that are not part of BY statement, act as follows: the values coming in from the right dataset override those coming in from the left dataset see SAS NOTE in Log results above This is usually not what the programmer would want, since it would make much more sense to combine all data related to toy Princess together; all data related to Electric Truck together; etc. 3
4 ONE-TO-ONE MATCH-MERGE KEEPING ALL OBSERVATIONS A Match-Merge combines observations from multiple datasets into a single observation in the result dataset based on the values of one or more common variables. It is highly recommended that you do the following: set the system option: MergeNoBy = ERROR; this ensures that if a MERGE statement is used without a corresponding BY statement the log will present an error message to that effect; use a BY statement in the data step to force SAS to put values into a single observation combining data from observations in the source datasets where the BY Variable has the same value; make sure to sort all source datasets by the matching variable(s) listed in the BY statement; if the datasets are not sorted properly you will get error messages in the log Note that by default a match-merge keeps all observations from all datasets; but each final observation gets its data values only from data variables that are contributed by those datasets with matching Toy Code values; where there is no contributing matching observation the data values are set to missing. Here again, the product is the same as a full outer-join where some of the observations have variables filled from both datasets, because a match was found, but others only get values from their source-dataset. 2 Note that by default a match-merge keeps all observations from all datasets; however, each final observation gets its data values only from data variables that are contributed by those datasets with matching Toy Code values; where there is no contributing matching observation the data values are set to missing. options mergenoby=error; proc sort data=toy; by Code; proc sort data=toygenderage; by Code; data Merged_ToyGA_ByCode; merge Toy (keep=code Description) ToyGenderAge; by Code; NOTE: There were 7 observations read from the data set WORK.TOY. NOTE: There were 6 observations read from the data set WORK.TOYGENDERAGE. NOTE: The data set WORK.MERGED_TOYGA_BYCODE has 8 observations and 5 variables. Code Description Gender AgeRangeLow AgeRangeHigh 0101 Baby Doll F Princess F Animal Set B Electric Truck M Model Train M Animal Cards 4400 Teddy Bear 5500 M 2 6 4
5 Note that: all observations from both datasets are kept where identical code value was found on both datasets, all variables get filled with data coming in from the corresponding source datasets; therefore, for codes 4300 and 4400 the combined observations contain Description values from the Toy dataset but no Gender or Age Range values coming in from the ToyGenderAge dataset; for Code 5500, the combined observation contains data values from the ToyGenderAge dataset but no Description from the Toy dataset ONE-TO-ONE MATCH-MERGE KEEPING SOME OBSERVATIONS In many cases we may want to further control which observations (of those that match) will actually be included in the final dataset. This is done via a subsetting if statement combined with an in= data option. There are several different choices such as: keep only those observations where a match is found on the BY variable in all source datasets keep all those that appear in the 1 st dataset whether or not a match is found in the 2 nd dataset keep all those that appear in the 2 nd dataset whether or not a match is found in the 1 st dataset In the 1 st instance the product is really an inner join data Merged_ToyGA_KeepOnlyMatched; merge Toy (in=a keep=code Description) ToyGenderAge (in=b) ; by Code; if a and b; NOTE: There were 7 observations read from the data set WORK.TOY. NOTE: There were 6 observations read from the data set WORK.TOYGENDERAGE. NOTE: The data set WORK.MERGED_TOYGA_KEEPONLYMATCHED has 5 observations and 5 variables. Code Description Gender AgeRangeLow AgeRangeHigh 0101 Baby Doll F Princess F Animal Set B Electric Truck M Model Train M 6 9 5
6 There are several things to note here: the in= option which uniquely identifies each source dataset; the by Code statement which ensures a one-to-one matching; the if a and b statement, which instructs SAS to keep only those observations with matching code values in both datasets; those observations with code values that appear in only one or the other dataset get excluded from the final combined dataset; In the 2 nd instance, what we get is a statement of if a ensures that all observations and only observations from dataset Toy will be kept in the final dataset; the data values coming from the ToyGenderAge will be set to missing when no matching observation with that Code value is found there; result in log data Merged_ToyGA_KeepOnlyLeft; merge Toy (in=a keep=code Description) ToyGenderAge (in=b) ; by Code; if a; NOTE: The data set WORK.MERGED_TOYGA_KEEPONLYLEFT has 7 observations and 5 variables. Code Description Gender AgeRangeLow AgeRangeHigh 0101 Baby Doll F Princess F Animal Set B Electric Truck M Train Thomas M Animal Cards Teddy Bear.. 6
7 In the 3 rd instance a statement of if b ensures that all observations and only observations from dataset ToyGenderAge will be kept in the final dataset; the data values coming from Toy will be set to missing when no matching observation with that Code value is found in the Toy dataset; result in log data Merged_ToyGA_KeepOnlyRight; merge Toy (in=a keep=code Description) ; by Code; if b; ToyGenderAge (in=b) NOTE: The data set WORK.MERGED_TOYGA_KEEPONLYRIGHT has 6 observations and 5 variables. Code Description Gender AgeRangeLow AgeRangeHigh 0101 Baby Doll F Princess F Animal Set B Electric Truck M Train Thomas M M 2 6 ONE-TO-MANY MERGE One of the most common purposes of the one-to-many merge is to join individual observations with summarystatistics for purposes of evaluations and comparisons; another purpose is to combine detailed data with higher level data, as in our example datasets, combining the Toys with their Company name. There are many toys per company. proc sort data=toy; by CompanyCode; proc sort data=company; by CompanyCode; data Merged_ToyCompany; merge Toy Company; by CompanyCode; NOTE: There were 7 observations read from the data set WORK.TOY. NOTE: There were 2 observations read from the data set WORK.COMPANY. NOTE: The data set WORK.MERGED_TOYCOMPANY has 7 observations and 4 variables. 7
8 Code Description Company Code Company Name 0101 Baby Doll 1000 Kids Toys 1202 Princess 1000 Kids Toys 1316 Animal Set 1000 Kids Toys 3201 Electric Truck 1000 Kids Toys 3220 Model Train 1000 Kids Toys 4300 Animal Cards 2000 More Toys 4400 Teddy Bear 2000 More Toys Important issues to note for the one-to-many merge are: In DATA Step MERGE the one-to-many and many-to-one merges are the same! The order of the dataset names within the MERGE statement has no significance; the actual merge action still combines one observation from a dataset to one observation from another; The data from each observation coming from the one side is retained through all merges with the many side (until a new observation comes in from the one side); see later discussion of the Program data Vector Common variables that are not included in the BY statement should be renamed since bringing them in may lead to errors. In a one-to-one merge a common variable s value coming from a later dataset simply overwrites the value from an earlier dataset (in the order that the datasets appear in the MERGE statement). This is not always true in the case of a one-to-many merge. It is good practice to always rename common variables as they come in from the source files and calculate a final value in the result dataset. Use the RENAME= option per dataset in the MERGE statement; see later discussion of the Program data Vector MANY-TO-MANY MERGE The many-to-many merge refers to the instance where at least two source datasets contain multiple repeats of values in the BY variables used for match-merging. An example of a many-to-many merge using our datasets is to present all possible factories from where all toys of a given company may be shipped. Another way to describe this: show any factory from which any toy may be shipped. proc sort data=toy; by CompanyCode Code; proc sort data=factory; by CompanyCode FactoryCode; /* create cross walk dataset to tell us how many factories per company and assigns them numbers */ data Factory Company_Xwalk(keep=CompanyCode MaxFactory); retain FactoryNumber 0; set Factory; by CompanyCode; if first.companycode then cnt=0; FactoryNumber +1; MaxFactory = FactoryNumber; output factory; if last.companycode then output Company_Xwalk; 8
9 /* prepare the toys dataset by merging with the company Xwalk */ data ToyWithFN (drop=i); merge Toy(in=a) Company_Xwalk(in=b) ; by CompanyCode; if a; if not b then put "No Company record found for Toy: " _all_; /* per toy - output multiple records - one per factory */ do i =1 to MaxFactory; end; FactoryNumber=i; output; /* we now finaly merge Toys with Factories */ proc sort data=toywithfn; by CompanyCode FactoryNumber Code; proc sort data=factory; by CompanyCode FactoryNumber; data Merged_ToyFactory (drop=maxfactory FactoryNumber); merge ToyWithFN(in=a) Factory(in=b) ; by CompanyCode FactoryNumber; NOTE: The data set WORK.COMPANY_XWALK has 2 observations and 2 variables. NOTE: The data set WORK.TOYWITHFN has 21 observations and 5 variables. NOTE: There were 21 observations read from the data set WORK.TOYWITHFN. NOTE: There were 6 observations read from the data set WORK.FACTORY. NOTE: The data set WORK.MERGED_TOYFACTORY has 21 observations and 5 variables. Code Description CompanyCode FactoryCode FactoryState 0101 Baby Doll MD 1202 Princess MD 1316 Animal Set MD 3201 Electric Truck MD 3220 Model Train MD 0101 Baby Doll NY 1202 Princess NY 1316 Animal Set NY 3201 Electric Truck NY 3220 Model Train NY 0101 Baby Doll VT 9
10 1202 Princess VT 1316 Animal Set VT 3201 Electric Truck VT 3220 Model Train VT 4300 Animal Cards AZ 4400 Teddy Bear AZ 4300 Animal Cards ME 4400 Teddy Bear ME 4300 Animal Cards CA 4400 Teddy Bear CA Important notes for the many-to-many merge: As shown in the SAS code, the goal here is to combine many toys with many factories. The MERGE statement however still ends up combining observations from the 1 st dataset with observations of the other datasets, one by one Before performing the merge, several steps are needed to prepare the source datasets: we use PROC SORT for each source dataset and we create a crosswalk dataset; etc. Much less work is needed to accomplish the task of combining many-to-many via the PROC SQL JOIN 3 MERGE AND THE PROGRAM DATA VECTOR In order to illustrate what happens in the Program Data Vector (PDV) when a MERGE is done, we ll use two new and very simple datasets that contain student grades. The 1 st dataset contains grades for English class and the 2 nd contains grades for a Math class. Each of these datasets contains three variables per record: StudentID, Grade and TeacherID. The English dataset contains 1 record each for The Math dataset contains one record each for StudentIDs 101,102 and 104 but two records for 103 StudentIDs 101, 103 and 104 StudentI Grade TeacherID StudentID Grade TeacherID E M E M E M E E02 In order to get the students grades and averages into a single dataset we ll use the following code: proc sort data=english; by StudentID; proc sort data=math; data Grades; by StudentID; merge English (in=a rename=(grade=english_grade)) ; by StudentID; Math (in=b rename=(grade=math_grade)) 10
11 When data is mapped into the PDV, any variable with identical name across the two datasets, and which is not used as a BY variable, may become corrupt. Therefore, in this example the PDV contains the following: StudentID English Math_ TeacherID First. Last. _Grade Grade StudentID StudentID _N ERROR_ M E M E M When the first record comes in from the English dataset, the variables StudentID, English_Grade, and TeacherID are properly stored in the appropriate storage units. When the Math record for that StudentID comes in, the Math_Grade is correctly added. But, the TeacherID value coming in from the Math dataset replaces the TeacherID which was already there from the English dataset. If no record exists for this StudentID in the Math dataset the Math_Grade remains missing and the TeacherID is not replaced. The variable of TeacherID just became meaningless because some of the time it contains the English TeacherID and at other times it contains the Math TeacherID. The code should have included a RENAME= for the TeacherID variable similar to that done for the Grade variables, or the TeacherID variable should have been dropped. The following principles should always be remembered 4 : 1. Only one value can be held under one name in the PDV at any one time 2. No common variable between two or more data sets listed in the merge with the exception of the BY variables that must be common to all the data sets 3. No more than one data set with multiple records for any combination of BY values Remember that it is a mistake to think that the PDV always gets filled with the value of the variable which comes from the last dataset mentioned on the MERGE. It is important to note that a variable coming from any dataset is RETAINED by the PDV only if there does not exist a variable by the same name already coming in from a previous dataset! In cases where there are multiple records per BY variable in the 1 st dataset, only the 1 st of these gets a value from the last dataset to replace the value from the previous dataset. All the other records do not receive this new value! BEWARE OF THE FOLLOWING NOTES IN THE LOG Some notes that appear in the LOG, even though they are not marked as errors or warnings are very dangerous to ignore. It is much better to add the code that is necessary to make such notes disappear. These include: (1) NOTE: More than one dataset have repeats of the BY variables (2) NOTE: the variable xxx in data A is replaced by variable xxx in data B Note (1) may appear under the following conditions: merging the English dataset with the Math dataset by StudentID, where there are multiple grade records per student in each (due to multiple sessions). Possible solutions: keep only the latest or highest grade per student; or, add the sessionid to the BY statement and join the datasets by both student ID and SessionID. Note (2) may appear in the case shown above where TeacherID appeared in both datasets. Either rename the variable or drop it, as appropriate. 11
12 CONCLUSION The DATA step Merge is a powerful tool but you need to know all rules governing its functionality and use them to advantage. Here is a list of the salient features of the merge: One-to-one oriented (consequently limited but offers very tight control) Observations are read once (SAS data retained) Default is a one-to-one "outer-join" using the given order of observations in the source datasets BY variables must have same name and type and preferably same length too in all source tables The order of the data sets should not matter; therefore no variables (other than the BY variables) should be in common; variables should be renamed (if needed) IN= variables are not reset by the system unless new data is read Match-merge of two datasets (merge with "BY Common variable(s)" but without a subsetting "IF" still results in a full outer-join but combines observations that have something in common "Outer-joins" may be done on multiple source datasets Need to sort the source datasets before the data step match-merge Merge of datasets with "BY common variables(s) and "If a and b" results in an inner join and therefore, a limited product Merge of datasets with "BY common variables(s) and If a or If b is used, results in another type of limited product where all records from either source are kept; same rule holds for any dataset selected from however many datasets that participate in the merge In a one-to-one match-merge, common variables that are not included in the match condition (i.e. are not part of the BY statement): the value from the latter dataset sometimes overwrites the value coming from the left-more dataset Impossible to do a many-to-many merge due to one-to-one behavior of MERGE NOTES 1 Refer to the SAS Language: Reference, chapter 9, description of the Merge statement 2 all Venn diagram images were taken from by Jeff Atwood 3 comparison of MERGE to PROC SQL offered in Kahane paper referenced below 4 Refer to Ian Whitlock s paper shown below REFERENCES Kahane, Dalia C. (2009), Using DATA Step MERGE and PROC SQL JOIN to Combine SAS Proceedings of the 2009 North East SAS Users Group Conference Datasets, Schreier, Howard (2005), Let Your Data Power Your DATA Step: Making Effective Use of the SET, MERGE, UPDATE, and MODIFY Statements, Proceedings of the 30 th Annual SAS Users Group International Conference SAS Institute Inc. (1990), SAS Language: Reference, Version 6, 1 st Edition, Cary, NC: SAS Institute Inc. Whitlock, Ian (2006), How to Think Through the SAS DATA Step, Proceedings of the 31 st Annual SAS Users Group International Conference 12
13 DISCLAIMER The contents of this paper are the work of the author and do not necessarily represent the opinions, recommendations, or practices of Westat. ACKNOWLEDGEMENTS I would like to thank Ian Whitlock and Michael Raithel who reviewed my paper, provided comments, and made this a true learning experience for me. CONTACT INFORMATION If you have any questions or comments about the paper, you can reach the author at: Dalia Kahane, Ph.D. Westat 1600 Research Blvd. Rockville, MD Kahaned1@Westat.com SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. indicates USA registration. Other brand and product names are registered trademarks or trademarks of their respective companies. 13
Using DATA Step MERGE and PROC SQL JOIN to Combine SAS Datasets Dalia C. Kahane, Westat, Rockville, MD
Using DATA Step MERGE and PROC SQL JOIN to Combine SAS Datasets Dalia C. Kahane, Westat, Rockville, MD ABSTRACT This paper demonstrates important features of combining datasets in SAS. The facility to
More informationPaper 2917. Creating Variables: Traps and Pitfalls Olena Galligan, Clinops LLC, San Francisco, CA
Paper 2917 Creating Variables: Traps and Pitfalls Olena Galligan, Clinops LLC, San Francisco, CA ABSTRACT Creation of variables is one of the most common SAS programming tasks. However, sometimes it produces
More informationFoundations & Fundamentals. A PROC SQL Primer. Matt Taylor, Carolina Analytical Consulting, LLC, Charlotte, NC
A PROC SQL Primer Matt Taylor, Carolina Analytical Consulting, LLC, Charlotte, NC ABSTRACT Most SAS programmers utilize the power of the DATA step to manipulate their datasets. However, unless they pull
More informationDemonstrating a DATA Step with and without a RETAIN Statement
1 The RETAIN Statement Introduction 1 Demonstrating a DATA Step with and without a RETAIN Statement 1 Generating Sequential SUBJECT Numbers Using a Retained Variable 7 Using a SUM Statement to Create SUBJECT
More informationPharmaSUG 2015 - Paper QT26
PharmaSUG 2015 - Paper QT26 Keyboard Macros - The most magical tool you may have never heard of - You will never program the same again (It's that amazing!) Steven Black, Agility-Clinical Inc., Carlsbad,
More informationPaper 109-25 Merges and Joins Timothy J Harrington, Trilogy Consulting Corporation
Paper 109-25 Merges and Joins Timothy J Harrington, Trilogy Consulting Corporation Abstract This paper discusses methods of joining SAS data sets. The different methods and the reasons for choosing a particular
More informationProgramming Tricks For Reducing Storage And Work Space Curtis A. Smith, Defense Contract Audit Agency, La Mirada, CA.
Paper 23-27 Programming Tricks For Reducing Storage And Work Space Curtis A. Smith, Defense Contract Audit Agency, La Mirada, CA. ABSTRACT Have you ever had trouble getting a SAS job to complete, although
More informationBeyond the Simple SAS Merge. Vanessa L. Cox, MS 1,2, and Kimberly A. Wildes, DrPH, MA, LPC, NCC 3. Cancer Center, Houston, TX. vlcox@mdanderson.
Beyond the Simple SAS Merge Vanessa L. Cox, MS 1,2, and Kimberly A. Wildes, DrPH, MA, LPC, NCC 3 1 General Internal Medicine and Ambulatory Treatment, The University of Texas MD Anderson Cancer Center,
More informationCreating Contrast Variables
Chapter 112 Creating Contrast Variables Introduction The Contrast Variable tool in NCSS can be used to create contrasts and/or binary variables for use in various analyses. This chapter will provide information
More informationSET The SET statement is often used in two ways copying and appending.
Point, Set, Match (Merge) A Beginner s Lesson Jennifer Hoff Lindquist, Institute for Clinical and Epidemiologic Research, Veterans Affairs Medical Center, Durham, NC The phrase Point, Set and Match is
More informationCounting the Ways to Count in SAS. Imelda C. Go, South Carolina Department of Education, Columbia, SC
Paper CC 14 Counting the Ways to Count in SAS Imelda C. Go, South Carolina Department of Education, Columbia, SC ABSTRACT This paper first takes the reader through a progression of ways to count in SAS.
More informationThe Essentials of Finding the Distinct, Unique, and Duplicate Values in Your Data
The Essentials of Finding the Distinct, Unique, and Duplicate Values in Your Data Carter Sevick MS, DoD Center for Deployment Health Research, San Diego, CA ABSTRACT Whether by design or by error there
More informationPaper TU_09. Proc SQL Tips and Techniques - How to get the most out of your queries
Paper TU_09 Proc SQL Tips and Techniques - How to get the most out of your queries Kevin McGowan, Constella Group, Durham, NC Brian Spruell, Constella Group, Durham, NC Abstract: Proc SQL is a powerful
More informationThe Program Data Vector As an Aid to DATA step Reasoning Marianne Whitlock, Kennett Square, PA
PAPER IN09_05 The Program Data Vector As an Aid to DATA step Reasoning Marianne Whitlock, Kennett Square, PA ABSTRACT The SAS DATA step is easy enough for beginners to produce results quickly. You can
More informationThe Query Builder: The Swiss Army Knife of SAS Enterprise Guide
Paper 1557-2014 The Query Builder: The Swiss Army Knife of SAS Enterprise Guide ABSTRACT Jennifer First-Kluge and Steven First, Systems Seminar Consultants, Inc. The SAS Enterprise Guide Query Builder
More informationTransforming SAS Data Sets Using Arrays. Introduction
Transforming SAS Data Sets Using Arrays Ronald Cody, Ed.D., Robert Wood Johnson Medical School, Piscataway, NJ Introduction This paper describes how to efficiently transform SAS data sets using arrays.
More informationSubsetting Observations from Large SAS Data Sets
Subsetting Observations from Large SAS Data Sets Christopher J. Bost, MDRC, New York, NY ABSTRACT This paper reviews four techniques to subset observations from large SAS data sets: MERGE, PROC SQL, user-defined
More informationWimba Create. Version 2.5. Installation Guide
Wimba Create Version 2.5 Installation Guide Wimba Create Installation Guide 1 Before Installing Wimba Create 1 Previous Versions 1 System Requirements 1 Installing Wimba Create 2 Wimba Create Licenses
More informationSUGI 29 Hands-on Workshops
Paper 123-29 Creating and Exploiting SAS Indexes Michael A. Raithel, Westat, Rockville, MD Abstract SAS indexes can drastically improve the performance of programs that access small subsets of observations
More informationA Study to Predict No Show Probability for a Scheduled Appointment at Free Health Clinic
A Study to Predict No Show Probability for a Scheduled Appointment at Free Health Clinic Report prepared for Brandon Slama Department of Health Management and Informatics University of Missouri, Columbia
More informationEverything you wanted to know about MERGE but were afraid to ask
TS- 644 Janice Bloom Everything you wanted to know about MERGE but were afraid to ask So you have read the documentation in the SAS Language Reference for MERGE and it still does not make sense? Rest assured
More informationProgramming Idioms Using the SET Statement
Programming Idioms Using the SET Statement Jack E. Fuller, Trilogy Consulting Corporation, Kalamazoo, MI ABSTRACT While virtually every programmer of base SAS uses the SET statement, surprisingly few programmers
More informationHow to Benchmark Your Building. Instructions for Using ENERGY STAR Portfolio Manager and Southern California Gas Company s Web Services
How to Benchmark Your Building Instructions for Using ENERGY STAR Portfolio Manager and Southern California Gas Company s Web Services This document is a quick-start guide for entering your property into
More informationSimulate PRELOADFMT Option in PROC FREQ Ajay Gupta, PPD, Morrisville, NC
ABSTRACT PharmaSUG 2015 - Paper QT33 Simulate PRELOADFMT Option in PROC FREQ Ajay Gupta, PPD, Morrisville, NC In Pharmaceuticals/CRO industries, table programing is often started when only partial data
More informationAlternatives to Merging SAS Data Sets But Be Careful
lternatives to Merging SS Data Sets ut e Careful Michael J. Wieczkowski, IMS HELTH, Plymouth Meeting, P bstract The MERGE statement in the SS programming language is a very useful tool in combining or
More informationThe SET Statement and Beyond: Uses and Abuses of the SET Statement. S. David Riba, JADE Tech, Inc., Clearwater, FL
The SET Statement and Beyond: Uses and Abuses of the SET Statement S. David Riba, JADE Tech, Inc., Clearwater, FL ABSTRACT The SET statement is one of the most frequently used statements in the SAS System.
More informationHow to Create an XML Map with the XML Mapper
How to Create an XML Map with the XML Mapper Wendi L. Wright CTB McGraw-Hill ABSTRACT You ve been given an XML file and told to read it into SAS. You open this file and think to yourself This looks like
More informationSchool Bullying Survey
School Bullying Survey This survey is not required for your class. If you choose not to complete this survey, your grade in the class will not be affected in any way. If this is your decision, just leave
More informationNeed for Speed in Large Datasets The Trio of SAS INDICES, PROC SQL and WHERE CLAUSE is the Answer, continued
PharmaSUG 2014 - Paper CC16 Need for Speed in Large Datasets The Trio of SAS INDICES, PROC SQL and WHERE CLAUSE is the Answer ABSTRACT Kunal Agnihotri, PPD LLC, Morrisville, NC Programming on/with large
More informationPaper FF-014. Tips for Moving to SAS Enterprise Guide on Unix Patricia Hettinger, Consultant, Oak Brook, IL
Paper FF-014 Tips for Moving to SAS Enterprise Guide on Unix Patricia Hettinger, Consultant, Oak Brook, IL ABSTRACT Many companies are moving to SAS Enterprise Guide, often with just a Unix server. A surprising
More informationa presentation by Kirk Paul Lafler SAS Consultant, Author, and Trainer E-mail: KirkLafler@cs.com
a presentation by Kirk Paul Lafler SAS Consultant, Author, and Trainer E-mail: KirkLafler@cs.com 1 Copyright Kirk Paul Lafler, 1992-2010. All rights reserved. SAS is the registered trademark of SAS Institute
More informationPowerScheduler Load Process User Guide. PowerSchool Student Information System
PowerSchool Student Information System Released November 18, 2008 Document Owner: Documentation Services This edition applies to Release 5.2 of the PowerSchool software and to all subsequent releases and
More informationA Gentle Introduction to Hash Tables. Kevin Martin, Kevin.Martin2@va.gov Dept. of Veteran Affairs July 15, 2009
A Gentle Introduction to Hash Tables Kevin Martin, Kevin.Martin2@va.gov Dept. of Veteran Affairs July 15, 2009 ABSTRACT Most SAS programmers fall into two categories. Either they ve never heard of hash
More informationCNPS Chapter Monthly Membership Report FAQ and Excel Tips. 1. The design and purpose of this report.
CNPS Chapter Monthly Membership Report FAQ and Excel Tips Index: 1. The design and purpose of this report. Pg 1 2. How to alphabetize the roster by last name/how to sort by any column in Excel. Pg 2 3.
More informationCross platform Migration of SAS BI Environment: Tips and Tricks
ABSTRACT Cross platform Migration of SAS BI Environment: Tips and Tricks Amol Deshmukh, California ISO Corporation, Folsom, CA As a part of organization wide initiative to replace Solaris based UNIX servers
More informationMultiple Set Statements in a Data Step: A Powerful Technique for Combining and Aggregating Complex Data. Renu Gehring
Multiple Set Statements in a Data Step: A Powerful Technique for Combining and Aggregating Complex Data Renu Gehring SAS Instructor Ace-Cube, LLP Beaverton, OR Health Care Analyst CareOregon, Inc. Portland,
More informationTable 1. Demog. id education B002 5 b003 8 b005 5 b007 9 b008 7 b009 8 b010 8
Adding PROC SQL to your SAS toolbox for merging multiple tables without common variable names Susan Wancewicz, Moores Cancer Center, UCSD, La Jolla, CA ABSTRACT The SQL procedure offers an efficient method
More informationSAS Enterprise Guide A Quick Overview of Developing, Creating, and Successfully Delivering a Simple Project
Paper 156-29 SAS Enterprise Guide A Quick Overview of Developing, Creating, and Successfully Delivering a Simple Project Ajaz (A.J.) Farooqi, Walt Disney Parks and Resorts, Lake Buena Vista, FL ABSTRACT
More informationPreserving Line Breaks When Exporting to Excel Nelson Lee, Genentech, South San Francisco, CA
PharmaSUG 2014 Paper CC07 Preserving Line Breaks When Exporting to Excel Nelson Lee, Genentech, South San Francisco, CA ABSTRACT Do you have imported data with line breaks and want to export the data to
More informationIntro to Longitudinal Data: A Grad Student How-To Paper Elisa L. Priest 1,2, Ashley W. Collinsworth 1,3 1
Intro to Longitudinal Data: A Grad Student How-To Paper Elisa L. Priest 1,2, Ashley W. Collinsworth 1,3 1 Institute for Health Care Research and Improvement, Baylor Health Care System 2 University of North
More informationExtending the Metadata Security Audit Reporting Capabilities of the Audit and Performance Measurement Package October 2010
Extending the Metadata Security Audit Reporting Capabilities of the Audit and Performance Measurement Package October 2010 ENTERPRISE EXCELLENCE CENTER Table of Contents 1 Introduction... 1 2 Metadata
More informationUNIVERSAL REMOTE CONTROL GUIDE
UNIVERSAL REMOTE CONTROL GUIDE Service provided by We Keep You Connected Your new AT6400 AllTouch Infrared (IR) Universal Remote Control (remote) is a true universal remote, functioning as four remotes
More informationText Analytics Illustrated with a Simple Data Set
CSC 594 Text Mining More on SAS Enterprise Miner Text Analytics Illustrated with a Simple Data Set This demonstration illustrates some text analytic results using a simple data set that is designed to
More informationRead this syllabus very carefully. If there are any reasons why you cannot comply with what I am requiring, then talk with me about this at once.
LOGIC AND CRITICAL THINKING PHIL 2020 Maymester Term, 2010 Daily, 9:30-12:15 Peabody Hall, room 105 Text: LOGIC AND RATIONAL THOUGHT by Frank R. Harrison, III Professor: Frank R. Harrison, III Office:
More informationLOCF-Different Approaches, Same Results Using LAG Function, RETAIN Statement, and ARRAY Facility Iuliana Barbalau, ClinOps LLC. San Francisco, CA.
LOCF-Different Approaches, Same Results Using LAG Function, RETAIN Statement, and ARRAY Facility Iuliana Barbalau, ClinOps LLC. San Francisco, CA. ABSTRACT LOCF stands for Last Observation Carried Forward
More informationLost in Space? Methodology for a Guided Drill-Through Analysis Out of the Wormhole
Paper BB-01 Lost in Space? Methodology for a Guided Drill-Through Analysis Out of the Wormhole ABSTRACT Stephen Overton, Overton Technologies, LLC, Raleigh, NC Business information can be consumed many
More informationAnyone Can Learn PROC TABULATE
Paper 60-27 Anyone Can Learn PROC TABULATE Lauren Haworth, Genentech, Inc., South San Francisco, CA ABSTRACT SAS Software provides hundreds of ways you can analyze your data. You can use the DATA step
More informationSurvey Analysis: Options for Missing Data
Survey Analysis: Options for Missing Data Paul Gorrell, Social & Scientific Systems, Inc., Silver Spring, MD Abstract A common situation researchers working with survey data face is the analysis of missing
More information2: Entering Data. Open SPSS and follow along as your read this description.
2: Entering Data Objectives Understand the logic of data files Create data files and enter data Insert cases and variables Merge data files Read data into SPSS from other sources The Logic of Data Files
More informationPT AVENUE GUIDE OVERVIEW
PT AVENUE GUIDE OVERVIEW WSPTA is currently undertaking a database conversion from imis (the previous membership database) to a cloud based service called PT Avenue. The primary reason for this conversion
More informationBinary Logistic Regression
Binary Logistic Regression Main Effects Model Logistic regression will accept quantitative, binary or categorical predictors and will code the latter two in various ways. Here s a simple model including
More informationAim To help students prepare for the Academic Reading component of the IELTS exam.
IELTS Reading Test 1 Teacher s notes Written by Sam McCarter Aim To help students prepare for the Academic Reading component of the IELTS exam. Objectives To help students to: Practise doing an academic
More informationOne problem > Multiple solutions; various ways of removing duplicates from dataset using SAS Jaya Dhillon, Louisiana State University
One problem > Multiple solutions; various ways of removing duplicates from dataset using SAS Jaya Dhillon, Louisiana State University ABSTRACT In real world, analysts seldom come across data which is in
More informationDefining a Validation Process for End-user (Data Manager / Statisticians) SAS Programs
Defining a Validation Process for End-user (Data Manager / Statisticians) SAS Programs Andy Lawton, Boehringer Ingelheim UK Ltd., Berkshire, England INTRODUCTION The requirements for validating end-user
More informationPROC SQL for SQL Die-hards Jessica Bennett, Advance America, Spartanburg, SC Barbara Ross, Flexshopper LLC, Boca Raton, FL
PharmaSUG 2015 - Paper QT06 PROC SQL for SQL Die-hards Jessica Bennett, Advance America, Spartanburg, SC Barbara Ross, Flexshopper LLC, Boca Raton, FL ABSTRACT Inspired by Christianna William s paper on
More informationKEYWORDS ARRAY statement, DO loop, temporary arrays, MERGE statement, Hash Objects, Big Data, Brute force Techniques, PROC PHREG
Paper BB-07-2014 Using Arrays to Quickly Perform Fuzzy Merge Look-ups: Case Studies in Efficiency Arthur L. Carpenter California Occidental Consultants, Anchorage, AK ABSTRACT Merging two data sets when
More informationGPS 72. Personal Navigator. Read This First! quick start guide
GPS 72 Personal Navigator Read This First! quick start guide Internal Antenna Quick Start Unit Overview Interface keys MOB ZOOM Battery Compartment MARK External Data/Auxilary Power Port 120 x 160 Four
More informationInternet basics 2.3 Protecting your computer
Basics Use this document with the glossary Beginner s guide to Internet basics 2.3 Protecting your computer How can I protect my computer? This activity will show you how to protect your computer from
More informationDOH 329 Registry Physician Initiated Application
DOH 329 Registry Physician Initiated Application Detailed Instructions For Certifying Physicians 11/12/2015 Physician Initiated Application Instructions 1 Background On January 1, 2015, the Department
More informationProvider Web Portal Quick User Guide Version 5.0
Provider Web Portal Quick User Guide Version 5.0 Copyright Statement 2012 Gold Coast Health Plan. All rights reserved. Gold Coast Health Plan and logo are service marks of Gold Coast Health Plan in the
More informationEfficient Techniques and Tips in Handling Large Datasets Shilong Kuang, Kelley Blue Book Inc., Irvine, CA
Efficient Techniques and Tips in Handling Large Datasets Shilong Kuang, Kelley Blue Book Inc., Irvine, CA ABSTRACT When we work on millions of records, with hundreds of variables, it is crucial how we
More informationLearn How to Revise 1
Learn How to Revise 1 SCHOOL EXAM DATES 2016 END OF YEAR EXAMS FOR YEARS 7-9 BEGIN ON MONDAY 6 TH JUNE THEY WILL TAKE PLACE IN LESSONS DURING THIS WEEK AND IF NECESSARY THE WEEK AFTER. Some subjects are
More informationEPM Performance Suite Profitability Administration & Security Guide
BusinessObjects XI R2 11.20 EPM Performance Suite Profitability Administration & Security Guide BusinessObjects XI R2 11.20 Windows Patents Trademarks Copyright Third-party Contributors Business Objects
More informationInternet basics 2.2 Staying safe online. Beginner s guide to. Basics
Basics Beginner s guide to Internet basics 2.2 Staying safe online Use this document with the glossary A helper should take you through this guide This activity will help you register safely online and
More informationPhases of the Moon. Preliminaries:
Phases of the Moon Sometimes when we look at the Moon in the sky we see a small crescent. At other times it appears as a full circle. Sometimes it appears in the daylight against a bright blue background.
More informationB) Mean Function: This function returns the arithmetic mean (average) and ignores the missing value. E.G: Var=MEAN (var1, var2, var3 varn);
SAS-INTERVIEW QUESTIONS 1. What SAS statements would you code to read an external raw data file to a DATA step? Ans: Infile and Input statements are used to read external raw data file to a Data Step.
More informationMWSUG 2011 - Paper S111
MWSUG 2011 - Paper S111 Dealing with Duplicates in Your Data Joshua M. Horstman, First Phase Consulting, Inc., Indianapolis IN Roger D. Muller, First Phase Consulting, Inc., Carmel IN Abstract As SAS programmers,
More informationManaging Student Records Online at the Building Level
ReadyResults.net 2014 Managing Student Records Online at the Building Level For help, send email to: help@readyresults.net or call: 877-456-1547 Table of Contents Introduction... 1 Adding a Teacher...
More informationFirst Data Personal Financial Manager (PFM) FAQ s
First Data Personal Financial Manager (PFM) FAQ s Q: Can PFM be presented in a language other than English? A: Currently the PFM product is English language supported only. There are no current plans to
More informationCredit Union Employee Security - Understanding CU*BASE
Auditing Employee Access to CU*BASE Tools Understanding CU*BASE Employee Activity Tracking Features & Data Center Employee Security INTRODUCTION This booklet describes special features your credit union
More informationUnderstanding Wheel Offset and Backspacing
Understanding Offset and Backspacing Proper service and repair procedures are vital to the safe, reliable operation of all motor vehicles as well as the personal safety of those performing the repairs.
More informationSAS and Clinical IVRS: Beyond Schedule Creation Gayle Flynn, Cenduit, Durham, NC
Paper SD-001 SAS and Clinical IVRS: Beyond Schedule Creation Gayle Flynn, Cenduit, Durham, NC ABSTRACT SAS is the preferred method for generating randomization and kit schedules used in clinical trials.
More informationKEY FEATURES OF SOURCE CONTROL UTILITIES
Source Code Revision Control Systems and Auto-Documenting Headers for SAS Programs on a UNIX or PC Multiuser Environment Terek Peterson, Alliance Consulting Group, Philadelphia, PA Max Cherny, Alliance
More information@ptitude Observer Database Adminstrator. User Manual. Part No. 32170600 Revision E Observer 9.1
@ptitude Observer Database Adminstrator Part No. 32170600 Revision E Observer 9.1 User Manual Copyright 2014 by SKF Reliability Systems All rights reserved. Aurorum 30, 977 75 Luleå Sweden Telephone: +46
More informationOA4-13 Rounding on a Number Line Pages 80 81
OA4-13 Rounding on a Number Line Pages 80 81 STANDARDS 3.NBT.A.1, 4.NBT.A.3 Goals Students will round to the closest ten, except when the number is exactly halfway between a multiple of ten. PRIOR KNOWLEDGE
More informationDATA CLEANING: LONGITUDINAL STUDY CROSS-VISIT CHECKS
Paper 1314-2014 ABSTRACT DATA CLEANING: LONGITUDINAL STUDY CROSS-VISIT CHECKS Lauren Parlett,PhD Johns Hopkins University Bloomberg School of Public Health, Baltimore, MD Cross-visit checks are a vital
More informationTaming the PROC TRANSPOSE
Taming the PROC TRANSPOSE Matt Taylor, Carolina Analytical Consulting, LLC ABSTRACT The PROC TRANSPOSE is often misunderstood and seldom used. SAS users are unsure of the results it will give and curious
More informationMy Classroom Management Philosophy
My Classroom Management Philosophy I believe one of the hardest things for new teachers to build is their classroom management plan. I have seen many different types of classroom management plans throughout
More informationMATH Student Book. 5th Grade Unit 7
MATH Student Book th Grade Unit Unit FRACTION OPERATIONS MATH 0 FRACTION OPERATIONS Introduction. Like Denominators... Adding and Subtracting Fractions Adding and Subtracting Mixed Numbers 0 Estimating
More informationA Many to Many Merge, Without SQL? Paper TU05
A Many to Many Merge, Without SQL? Paper TU05 David Franklin Independent SAS Consultant TheProgrammersCabin.com While you are waiting, some trivia. The first U.S. Transcontinental Flight took 84 days,
More informationMore Tales from the Help Desk: Solutions for Simple SAS Mistakes Bruce Gilsen, Federal Reserve Board
More Tales from the Help Desk: Solutions for Simple SAS Mistakes Bruce Gilsen, Federal Reserve Board INTRODUCTION In 20 years as a SAS consultant at the Federal Reserve Board, I have seen SAS users make
More informationThe Best-Kept Secret of Forex
The Best-Kept Secret of Forex Many traders go through trading system after trading system, only to find that most of them don t work. The truth of the matter is that there are many effective trading systems
More informationEffective Use of SQL in SAS Programming
INTRODUCTION Effective Use of SQL in SAS Programming Yi Zhao Merck & Co. Inc., Upper Gwynedd, Pennsylvania Structured Query Language (SQL) is a data manipulation tool of which many SAS programmers are
More informationLabels, Labels, and More Labels Stephanie R. Thompson, Rochester Institute of Technology, Rochester, NY
Paper FF-007 Labels, Labels, and More Labels Stephanie R. Thompson, Rochester Institute of Technology, Rochester, NY ABSTRACT SAS datasets include labels as optional variable attributes in the descriptor
More informationMAKING FRIENDS WITH MATH
MAKING FRIENDS WITH MATH Workshop sponsored by: The Dr. Mack Gipson, Jr., Tutorial and Enrichment Center Presented by: Carole Overton, Director The Dr. Mack Gipson, Jr., Tutorial and Enrichment Center
More informationScript/Notes for PowerPoint Presentation. Medication Use Safety Training for Seniors (MUST for Seniors)
Script/Notes for PowerPoint Presentation Medication Use Safety Training for Seniors (MUST for Seniors) Instructions: You can use the following script to help you prepare your remarks to your organization
More informationfor the Bill Hanlon bill@hanlonmath.com
Strategies for Learning the Math Facts Bill Hanlon bill@hanlonmath.com The more sophisticated mental operations in mathematics of analysis, synthesis, and evaluation are impossible without rapid and accurate
More informationMicrosoft Migrating to Word 2010 from Word 2003
In This Guide Microsoft Word 2010 looks very different, so we created this guide to help you minimize the learning curve. Read on to learn key parts of the new interface, discover free Word 2010 training,
More informationGuido s Guide to PROC FREQ A Tutorial for Beginners Using the SAS System Joseph J. Guido, University of Rochester Medical Center, Rochester, NY
Guido s Guide to PROC FREQ A Tutorial for Beginners Using the SAS System Joseph J. Guido, University of Rochester Medical Center, Rochester, NY ABSTRACT PROC FREQ is an essential procedure within BASE
More informationThe Power of PROC DATASETS Lisa M. Davis, Blue Cross Blue Shield of Florida, Jacksonville, Florida
Paper #TU20 The Power of PROC DATASETS Lisa M. Davis, Blue Cross Blue Shield of Florida, Jacksonville, Florida ABSTRACT The DATASETS procedure can be used to do many functions that are normally done within
More informationMathematics Higher Level
Mathematics Higher Level for the IB Diploma Exam Preparation Guide Paul Fannon, Vesna Kadelburg, Ben Woolley, Stephen Ward INTRODUCTION ABOUT THIS BOOK If you are using this book, you re probably getting
More informationNTFS permissions represent a core part of Windows s security system. Using
bonus appendix NTFS Permissions NTFS permissions represent a core part of Windows s security system. Using this feature, you can specify exactly which coworkers are allowed to open which files and folders
More informationCreating Word Tables using PROC REPORT and ODS RTF
Paper TT02 Creating Word Tables using PROC REPORT and ODS RTF Carey G. Smoak,, Pleasanton, CA ABSTRACT With the introduction of the ODS RTF destination, programmers now have the ability to create Word
More informationPreparing and Revising for your GCSE Exams
Preparing and Revising for your GCSE Exams Preparing and Revising for GCSEs Page 2 Contents Introduction 3 Effective Learning and Revision 4 What you need to Revise 5 Revision Notes and Practice 6 Getting
More informationEnglish Language Arts Test Book 2
English Language Arts Test Book 2 Grade 3 April 26 28, 2010 Name 21610 Tips for taking the test Here are some suggestions to help you do your best: Be sure to read carefully all the directions in the test
More informationA PUBLIC AGENDA CITIZEN CHOICEWORK GUIDE FOR COMMUNITY CONVERSATIONS, CLASSROOMS, STUDY GROUPS AND INDIVIDUALS. Public Agenda
PUBLIC AGENDA Independent, Thought-Provoking, Always in the Public Interest Teaching Methods A PUBLIC AGENDA CITIZEN CHOICEWORK GUIDE FOR COMMUNITY CONVERSATIONS, CLASSROOMS, STUDY GROUPS AND INDIVIDUALS
More informationSteps in Implementing Self-Monitoring
14 Mason, Reid, & Hagaman not they are paying attention. This is typically done by cuing students to self-assess through the use of an auditory cue (e.g., taped tones presented at random intervals). After
More informationWhat s New in Accounts Receivable!
What s New in Accounts Receivable! By Mike Ausderan Welcome to What s New in Accounts Receivable; Once again my name is Mike Ausderan, I m a trainer at Britannia. During this webinar we will be covering
More informationUser guide for the Error & Warning LabVIEW toolset
User guide for the Error & Warning LabVIEW toolset Rev. 2014 December 2 nd 2014 1 INTRODUCTION... 1 2 THE LABVIEW ERROR CLUSTER... 2 2.1 The error description... 3 2.2 Custom error descriptions... 4 3
More informationDISTANCE LEARNING CENTRE FEES & CHARGES
DISTANCE LEARNING CENTRE FEES & CHARGES IMPORTANT INFORMATION ABOUT FEES AND PAYMENTS Unlike traditional Colleges, the Distance Learning Centre receives no government funding. We are entirely reliant on
More information