使用SAS V5传输文件存储导出长R变量名:haven与SASxport对比
将R长变量名存入SAS V5传输文件标签区:haven与SASxport包对比
需求背景
我需要把SAS V5传输文件中的8字符变量名替换为存储在文件标签区的R长变量名,让Perl、Python、SAS、WPS等多种语言都能直接调用这些R变量名。
haven包的问题
使用haven包的write_xpt函数时遇到两个痛点:
- 带英文句点的R列名(如
Infant.Mortality)会直接报错 - 只能输出到当前工作目录,必须额外切换目录才能指定输出路径
为了适配write_xpt,需要额外做两步处理:
- 把带句点的列名(比如
Infant.Mortality)重命名为无句点的形式(InfantMortality) - 手动切换工作目录到目标输出路径
SASxport包的优势
Greg Warnes开发的SASxport包完全没有上述问题:
- 原生支持带句点等非标准格式的变量名和标签,无需修改列名
- 可以直接指定输出文件的完整路径,无需切换工作目录
- 使用逻辑更简洁,功能更成熟
不过SASxport已从CRAN移除,需要手动下载源码安装。
SASxport包安装步骤
- 从CRAN归档下载SASxport的源码包
- 安装rtools和devtools工具
- 执行以下命令安装源码包:
install.packages("你的下载文件名.tar.gz", repos = NULL, type="source")
代码示例对比
1. 使用haven包实现
proc datasets lib=sd1 nolist nodetails;delete want; run;quit; %utlfkil(d:/xpt/want_xpt); %utl_rbeginx; parmcards4; library(haven) library(labelled) # 移除列名中的句点 colfix<-sub("\\.","",colnames(swiss)) colnames(swiss) <- colfix; # 设置变量标签为处理后的列名 want <- set_variable_labels(swiss,.labels = colnames(swiss)) # 切换工作目录 setwd("d:/xpt") write_xpt(want,"want.xpt",version=5) ;;;; %utl_rendx; # 查看生成的XPT文件内容 libname xpt xport "d:/xpt/want.xpt"; proc contents data=xpt._all_; run;quit;
输出结果:
Alphabetic List of Variables and Attributes # Variable Type Len Label 2 AGRICULT Num 8 Agriculture 5 CATHOLIC Num 8 Catholic 4 EDUCATIO Num 8 Education 3 EXAMINAT Num 8 Examination 1 FERTILIT Num 8 Fertility 6 INFANTMO Num 8 InfantMortality
2. 使用SASxport包实现
proc datasets lib=sd1 nolist nodetails;delete want; run;quit; %utlfkil(d:/xpt/want_xpt); %utl_submit_r64x(' library(SASxport); library(labelled); # 直接设置变量标签为原列名(含句点) want <- set_variable_labels(swiss,.labels = colnames(swiss)); # 直接指定输出路径,无需切换目录 write.xport(want,file="d:/xpt/want.xpt"); '); # 查看生成的XPT文件内容 libname xpt xport "d:/xpt/want.xpt"; proc contents data=xpt._all_; run;quit;
输出结果:
Alphabetic List of Variables and Attributes # Variable Type Len Label 2 AGRICULT Num 8 Agriculture 5 CATHOLIC Num 8 Catholic 4 EDUCATIO Num 8 Education 3 EXAMINAT Num 8 Examination 1 FERTILIT Num 8 Fertility 6 INFANT_M Num 8 Infant.Mortality
内容的提问来源于stack exchange,提问作者Roger DeAngelis
相关产品推荐
相关产品推荐

