SAS:从零开始用proc report出人口统计学表

目的:如何生成如下图所示的人口统计学的表格
在这里插入图片描述

要点:
1、连续型变量(基线体重、基线身高等)需要展示例数、均值、中位值、最小值、最大值;离散型变量(性别、民族等)需要展示例数和百分比。这些统计量如何计算?
2、统计量需要保留几位小数?
3、如何令前3个剂量组、后5个剂量组分别属于共同的列名SC(肌肉注射)和IV(静脉滴注)?
4、如何在不同变量之间添加空行(如体重和性别之间用空行分割)?

步骤:
1、整合数据集,得到需要的变量:各受试者的组别、体重、性别;

/*1-rawdata*/
data dm1;
	merge dm rand wt(where=(visit='D-1'));
	by subjid;
	keep subjid sex weight grpn;
run;
/*2-generate total column*/
data dm2;
	set dm1;
	ouput;
	grpn=9;
	output;
run;
/*3-counts number of every group*/
proc sql noprint;
	select count(*) into:n1-:n9 
	group by grpn;
quit;
/*4-builds relation between grpn and &nx.*/
proc format;
	value total;
	1 = &n1.
	2 = &n2.
	3 = &n3.
	4 = &n4.
	5 = &n5.
	6 = &n6.
	7 = &n7.
	8 = &n8.
	9 = &n9.;
run;
data dm3;
	set dm2;
	var1='weight';/*the purpose for merging statistics with maxlen*/
	total=input(put(grpn,&total.),best.);
	if find(weight,'.') then len1=length(scan(weight,2,'.'));
	else len1=0;
/*5-generates different output format according to types of statistics:maxumum decimal places 4*/
proc sql noprint;
	create table maxlen1 as
	select "weight" as var1, max(len1) as maxl,
		   /*for medium, mean*/
		   case when (calculated maxl le 3) then
		   			 strip(put(8 + 0.1*(calculated maxl + 1),best.))
		        else strip(put(8 + 0.1*4,best.)) as maxl1,
		   /*for std*/
		   case when (calculated maxl le 2) then
		   			 strip(put(8 + 0.1*(calculated maxl + 2),best.))
		        else strip(put(8 + 0.1*4,best.)) as maxl2,
		  /*for n, min, max*/
		  strip(put(8 + 0.1*(calculated maxl),best.)) as maxl0
quit;

2、衍生变量:对连续型和离散型变量分别应用不同的proc步得到相应的统计量;

/*1-for continuous variables*/
proc sort data=dm3;
	by var1, grpn;
run;
proc summary data=dm3;
	by var1, grpn;
	var weight;
	output out=weight/n = _n mean = _mean median = _median min = _min max = _max;
run;
/*for discrete variables*/
proc freq data=dm3;
	by grpn;
	tables sex/out=sex;
run;

3、美化数据集:用cat和put/putn函数将Mock中需要的统计量展示方式进行组合;生成排序变量,保证最终的变量按照Mock中想要的顺序展示;

/*1-for continuous variables*/
data weight1;
	merge weight maxlen1;
	by var1;
	/*combine statistics according to _n*/
	n = strip(put(_n, best.));
	if _n >1 then do;
		msd = cat(strip(putn(_mean,maxl1)), ' (',
			      strip(putn(_std,maxl2)), ')');
	    med = cat(strip(putn(_median,maxl1)),' (',
	    		  strip(putn(_min,maxl0)), ', ',
	    		  strip(putn(_max,maxl0)),')');end;
	else do;
		msd = strip(putn(_mean,maxl1));
		med = strip(putn(_median,maxl1));end;
run;
proc transpose data=weight1 out=weight2 prefix=group;
	id grpn;
	var n msd med;
run;
data weight3;
	set weight2;
	variable = '体重(kg)';
	if _name_ = 'N' then stat = 'n';
	else if _name_ = 'MSD' then stat = '均值(标准差)';
	else if _name_ = 'MED' then stat = '中位值(最小值,最大值)';
run;
/*2-for discrete variables*/
proc sql noprint;
	create table sex1 as
	select '性别' as variable format = $100., grpn, sex as stat,
			cat(strip(put(count,best.)), ' (',
			strip(put(round(count/total*100,0.1),8.1.)), '%') as pct length = 100	
	from sex
	order by variable, stat, grpn;
quit;
/*3-set datasets*/
data z;
 	retain ord variable stat group1-group9 blk;
	set weight3 sex1;
	blk='';/*for breaking SC and IV*/
	if variable='体重(kg)' then ord = 1;
	else ord = 2;
	keep ord variable stat group1-group9 blk;

4、用proc report将美化后的数据集输出成rtf格式。

/*1-initialize rtf settings*/
options validvarname = upcase nodate nonumber nomprint orientation = landscape papersize = letter;
options topmargin = 2.54cm bottommargin = 2.54cm leftmargin = 2.54cm rightmargin = 2.54cm;
title;
ods escapechar="@";
ods listing close;
ods rtf file="C:\cdisc\tfl\dm.rtf" style=tab;
/*2-generate title*/
%let title=%str(1 受试者人口学特征描述性统计结果);
ods rtf text="@R/RTF'\ql\fs21\outlinelevel1\b\pnhang\fi-1200\li1200' &title.";
/*3-genarate complete table*/
proc report data = z 
	style(report) = {frame = hsides rules = groups cellpadding = 0 outputwidth = 100%}
	style(header) = {backgroundcolor = white fontweight = medium};
	column ord variable stat ("@R'\brdrb\brdrs' SC" group1-group3) blk ("@R'\brdrb\brdrs' IV" group4-group8) group9;
	define ord/order order=interval noprint;
	define variable/order order=data style(column)={just=left cellwidth=7%} style(header)={just=left} "变量";
	define stat    /order order=data style(column)={just=center cellwidth=12%} style(header)={just=center} "统计量";
	define group1/style(column)={just=center cellwidth=8%} style(header)={just=center} "3 mg";
	define group2/style(column)={just=center cellwidth=8%} style(header)={just=center} "10 mg";
	define group3/style(column)={just=center cellwidth=8%} style(header)={just=center} "20 mg";
	define blk   /style(column)={cellwidth=0.5%} style(header)={cellwidth=0.5%} ""
	define group4/style(column)={just=center cellwidth=8%} style(header)={just=center} "30 mg";
	define group5/style(column)={just=center cellwidth=8%} style(header)={just=center} "40 mg";
	define group6/style(column)={just=center cellwidth=8%} style(header)={just=center} "50 mg";
	define group7/style(column)={just=center cellwidth=8%} style(header)={just=center} "60 mg";
	define group8/style(column)={just=center cellwidth=8%} style(header)={just=center} "100 mg";
	define group9/style(column)={just=center cellwidth=8%} style(header)={just=center} "合计";
	
	compute after variable;
		varlen = ifn(ord=1,100,0);
		line blk $varying. varlen;
	endcomp;
run;

ods listing;
ods rtf colse;

拓展:
1、putn、putc、put、inputn、inputc、input的区别。

函数定义
putcenables you to specify a character format at run time
putnenables you to specify a numeric format at run time
putreturns a value using a specified format
inputcenables you to specify a character informat at run time
inputnenables you to specify a numeric informat at run time
inputreturns the value that is produced when SAS converts an expression by using the specified informat

从SAS Help中可以看到inputc函数和input函数进行对比,input函数在编译阶段就执行,而inputc函数在运行阶段执行,所以input函数比inputc函数更快执行(其实适用于input/put函数和与之对应的表格中的四个函数中,因为在这四个函数的定义中都可以看到他们都是在运行阶段执行的)在这里插入图片描述
因此,put函数在编译阶段就需要指定一个format,而putc或putn函数在运行阶段才要format。那么,这个format可以是运行阶段生成的变量。如果用于宏函数,就只能用putn或putc。
下面是SAS Help中的例子。

/*putn*/
proc format;
	value writfmt 1 = 'date9.'
				  2 = 'mmddyy10.';
run;

data dates;
	input number key;
	datefmt = put(key,writfmt.);
	date = putn(number,datefmt);
	datalines;
	15756 1
	14552 2
	;
run;

在这里插入图片描述

/*putc*/
proc format;
	value typefmt 1='$groupx'
				  2='$groupy';
	value $groupx 'positive'='agree'
		  		  'negtive' ='disagree';
	value $groupy 'positive'='pass'
		  		  'negtive' ='fail';
run;

data answers;
	length word $ 8;
	input type response $;
	respfmt=put(type,typefmt.);
	word=putc(response,respfmt);
	datalines;
	1 positive
	1 negtive
	2 negtive
	2 positive
	;
run;

在这里插入图片描述

/*inputn*/
proc format;
	value readfmt 1 = 'date9.'
				  2 = 'mmddyy10.';
run;

data dates;
	input number key;
	datefmt = put(key,readfmt .);
	date = inputn(number,datefmt);
	datalines;
	15756 1
	14552 2
	;
run;
/*inputc*/
proc format;
	value typefmt 1='$groupx'
				  2='$groupy';
	invalue $groupx 'positive'='agree'
		  		    'negtive' ='disagree';
    invalue $groupy 'positive'='pass'
		  		    'negtive' ='fail';
run;

data answers;
	length word $ 8;
	input type response $;
	respfmt=put(type,typefmt.);
	word=inputc(response,respfmt);
	datalines;
	1 positive
	1 negtive
	2 negtive
	2 positive
	;
run;

在这里插入图片描述

2、$varying格式及在proc report中插入新行的应用
在这里插入图片描述

/*adds new line afer every groups*/
define var /order|group;
compute after var;
	line "";
endcomp;

/*adds new line after specified groups*/
define var /order|group;
compute after var;
	blk="";
	if var in("1","3") then varlen=100;
	else varlen=0;
	line blk $varying. varlen;
endcomp;

3、RTF中常用的格式设置


\ql 左对齐(默认)
\fsN 以0.5磅为单位的字体大小(font size in half-points)\fs21就是10.5pt,也就是小五号字
\outlinelevelN 段落的大纲级别。N取值范围0-8.
\b 加粗
\b0 不加粗
\pnhang 段落悬挂缩进
\fiN 首行缩进N个twips,twips与磅之间的换算公式为:1 twip=1/20 pt。要求缩进2个字符,2个字符一般是5号字,也就是缩进10.5pt,那么就应该是\fi-210
\liN 左边缩进N个twips
/*要想悬挂缩进,一般是\pnhang\fiN\liN三个选项连用,pnhang表示需要进行段落悬挂缩进,li表示左边缩进N个,fi-N表示首行往前N个字符。这样从第2行开始的就是悬挂缩进,而保持第一行不缩进*/
\brdrb 下框线
\brdrs 单条线
\ul 下划线
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/720072.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ajax基础01】ajax简介

一:ajax简介 1 什么是ajax AJAX(Asynchronous JavaScript And XML )是一种在 Web 应用中通过异步发送 HTTP 请求向服务器获取内容,并使用这些新内容更新页面中相关的部分,而无需重新加载整个页面的 Web 开发技术。这可…

springboot 3.x 之 集成rabbitmq实现动态发送消息给不同的队列

背景 实际项目中遇到针对不同类型的消息,发送消息到不同的队列,而且队列可能还不存在,需要动态创建,于是写了如下代码,实践发现没啥问题,这里分享下。 环境 springboot 3.2 JDK 17 rabbitMQ模型介绍 图片…

6月议息偏鹰!国际现货黄金没戏了?

6月13日凌晨,FOMC连续第七次宣布维持利率不变,此举符合市场预期,但对于通胀的表述较5月更为乐观——将“近几个月,在实现委员会2%的通胀目标方面,缺乏进一步的进展”改为了“取得了适度的进一步进展”,加上…

KernelFuzzer部署、使用与原理分析

文章目录 前言1、概述1.1、整体架构1.2、工作流程1.2.1、环境配置流程1.2.2、计划任务执行流程1.2.3、Fuzz测试流程1.2.3.1、整体资源调度1.2.3.2、选取Fuzz测试目标1.2.3.3、生成Fuzz测试参数1.2.3.4、进行Fuzz测试 2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1…

一文读懂 Transformer 神经网络模型

今天我们来聊一下人工智能(AI)生态领域相关的技术 - Transformer 神经网络模型 。 自从最新的大型语言模型(LLaM)的发布,例如 OpenAI 的 GPT 系列、开源模型 Bloom 以及谷歌发布的 LaMDA 等,Transformer 模…

可燃气体报警器:户外工地安全预警先锋,定期检定保障安全无忧

在现代化的建设进程中,户外工地作为城市发展的重要推动力,其安全问题一直备受关注。 工地现场往往涉及多种易燃易爆气体,一旦发生泄漏,后果不堪设想。因此,如何有效预警并防范可燃气体泄露,成为户外工地安…

封装分发安装教程

【安装环境】 Linux伪静态 PHP7.1mysql5.6 SSL 证书 (使用宝塔) 1、在宝塔上面新建站点,把压缩包上传到根目录,解压出来,然后导入 sql 数据库文件,再 然后修改数据库配置 source\system\db_config.php 2、…

【GlobalMapper精品教程】085:coverage格式转shp案例教程

文章目录 一、Coverage格式介绍二、globalmapper转换shp1. 加载coverage2. coverage转shp一、Coverage格式介绍 Coverage 是一种用于存储矢量数据的地理相关数据模型,它包含地理要素的空间(位置)数据和属性(描述性)数据。Coverage 使用一组要素类来表示地理要素。每个要素…

对input输入框的正则限制

一、0-100的整数 正则&#xff1a; const inputRules ref([{required: false,trigger: "blur",validator: (rule, value, callback) > {const reg /^[0-9]$/; // 只允许整数if ((0 < value && value < 100 && reg.test(value)) ||valu…

视频汇聚安防综合管理系统EasyCVR平台GB28181设备注册未上线的原因排查与解决

视频汇聚安防综合管理平台EasyCVR视频监控系统基于云边端架构&#xff0c;可支持海量视频汇聚集中管理&#xff0c;能提供视频监控直播、云端录像、云存储、录像检索与回看、告警&#xff08;协议告警/智能告警/1400视图库告警&#xff09;、平台级联、AI智能分析接入等视频能力…

Python 库PySpark,一个超级强大的数据处理引擎

目录 01初识 PySpark 为什么选择 PySpark? 安装 PySpark 配置 PySpark 02基本操作 创建 RDD 基本 RDD 操作 03DataFrame 和 Spark SQL 创建 DataFrame 基本 DataFrame 操作 使用 Spark SQL 04机器学习与流处理 …

这俩项目,牛哇。

你每天是不是会在各个平台上浏览文章&#xff0c;比如公众号、知乎等等&#xff0c;想把看过的高质量文章管理在一个地方&#xff1f;第一个开源项目能帮到你。 第二个开源项目&#xff0c;是 AI 大佬吴恩达开源的基于 Agent 的项目&#xff0c;结合逛逛 GitHub 之前发布的 AI …

RK3568技术笔记九 编译Linux详细介绍

在编译前需要按照前面的方法始化编译环境&#xff0c;否则会导致编译失败&#xff08;若配置过则无需重复配置&#xff09;。 全自动编译包含所有镜像编译&#xff0c;包括&#xff1a;uboot编译、Kernel编译、Recovey编译、文件系统编译、编译完成镜像的更新与打包。 按照前面…

基于Spring Boot+VUE旅游管理系统

1管理员功能模块 管理员通过点击后台管理&#xff0c;进入页面可以输入用户名、密码、角色进行登录相对应操作&#xff0c;如图1所示。 图1管理员登录界面 管理员通过点击后台管理&#xff0c;进入页面可以填写首页、个人中心、用户管理、旅游方案管理、旅游购买管理、系统管…

多协议接入/GB28181/GAT1400协议/安防综合管理系统EasyCVR报错version`GLIBCXX_3.4.19‘not found如何处理?

多协议接入/GB28181/GAT1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、…

RemObjects教程

File—Other…—RemObjects Data Abstract—ComboServer Step(1) 在出现的 NewRemObjects SDK Server 对话框中 Project Folder &#xff1a;文件存档路径 Project Name &#xff1a;工程名称 Also-Create a matching client application and a project group&#xff1a;在创…

【麒麟虚拟机】NetworkManager没有运行

麒麟V10 建linux麒麟虚拟机&#xff0c;发现&#xff0c;网络没有配置 提示&#xff0c;NetworkManager没有运行。编辑联接也不能配置 解决方法&#xff0c;在终端输入命令&#xff1a; sudo systemctl start NetworkManager 启动以后&#xff0c;编辑连接选自动以太网&…

事件、方法实现 on_radioGreen_clicked ,on_chkBoxUnder_clicked,Qfont,QPalette

Vertical Layout 、Horizontal Layout 实验窗体自适应布局 接上篇界面布局&#xff0c; 实验checkBox、radioBox 的事件槽&#xff0c; 使用Qfont组件变更纯文本框QPlainTextEdit中字体的下划线、加粗、斜体效果 使用调色板组QPalette变更纯文本框QPlainTextEdit中文本颜色 UI…

Sectigo OV通配符SSL证书多少钱?

在网络安全领域&#xff0c;SSL数字证书起着至关重要的作用&#xff0c;尤其是在保护网站和用户信息方面。而Sectigo OV通配符证书是一种常用的数字证书之一&#xff0c;它能够为同一域名下的多个子域名提供保护&#xff0c;还能够通过企业验证来增强安全性。那么&#xff0c;对…

Table 宽度超出页面宽度时,出现滚动条,单元格内容不换行实

修改前 方法 <div styleoverflow:auto><table stylewhite-space: nowrap></table> </div>修改后