Merge 如何在合并数据集时防止SAS更改值

Merge 如何在合并数据集时防止SAS更改值,merge,sas,Merge,Sas,我正在尝试为工作编写SAS宏,该宏将接受: 数据集 定量自变量列表 一些二元自变量的分类列表;和 一个因变量 然后,宏将为2-3中列出的每个变量拟合一个简单的单变量模型,并报告每个模型的特定信息以及缺失值的数量 除了一个细节外,我已经让宏正常工作了:当我将两个表合并到最后一个表中时,SAS似乎正在删除部分字符串 宏首先为定量自变量拟合模型,将必要的模型信息存储在表中,然后对分类变量进行同样的操作 最后一步是将这两个表堆叠在一起。不幸的是,当我这样做时,参数列表的部分字符串正在消失。以下是一些有助

我正在尝试为工作编写SAS宏,该宏将接受:

数据集 定量自变量列表 一些二元自变量的分类列表;和 一个因变量 然后,宏将为2-3中列出的每个变量拟合一个简单的单变量模型,并报告每个模型的特定信息以及缺失值的数量

除了一个细节外,我已经让宏正常工作了:当我将两个表合并到最后一个表中时,SAS似乎正在删除部分字符串

宏首先为定量自变量拟合模型,将必要的模型信息存储在表中,然后对分类变量进行同样的操作

最后一步是将这两个表堆叠在一起。不幸的是,当我这样做时,参数列表的部分字符串正在消失。以下是一些有助于说明的图片:

这就是表格中仅包含基于定量自变量的模型的部分输出

这就是仅包含基于分类自变量的模型的表的输出部分。注意,在Parameter下面列出了伪变量的全名

但是,当我去合并/堆叠这些表时,SAS正在删除分类变量的伪变量的参数列中的所有after值。关于虚拟变量的信息是必要的,否则表中总结基于分类变量的单变量模型的部分基本上是没有意义的

这是我代码的一部分。很抱歉,我不能包含任何数据:

ODS output
NObs=Num_Obs_cat /*Output data on missing observations*/
parameterestimates=parameter_est_cat /*Output each model's parameter estimates*/
OverallANOVA=ANOVA_cat /*Output each model's ANOVA table for the p-value for the model's F-test*/;
proc glm data=long_format_cat;
class Value;
by X_ind;
model &depend=Value/SOLUTION EFFECTSIZE CLPARM;
run;
ODS output close;

/*Create a data set of all of the parameter estimates, with only the necessary columns*/
data parameter_est_cat1 (keep=X_ind parameter estimate probT LowerCL UpperCL rename=probT=p_value);
set parameter_est_cat;
run;

/*Create a data set of each model's F-test p-value*/
data ANOVA_cat1 (keep=X_ind ProbF);
set ANOVA_cat;
where not missing(ProbF); 
run;

/*Create a data set of of each model's missing observations*/
data Num_Obs_cat1 (keep=X_ind NObsUsed);
set Num_Obs_cat;
where Label='Number of Observations Used';
run;

/*Merge the three preceding data sets horizontally*/
data univ_summary_stats_cat;
merge parameter_est_cat1 Num_Obs_cat1 long_format_cat5 ANOVA_cat1;
by X_ind;
run;

/*Merge all of the tables together.  THIS IS THE STEP WHERE I BELIEVE IT'S GOING WRONG.
'univ_summary_stats_quant' has the same columns as 'univ_summary_stats_cat' so they
should be able to be merged/set one on top of each other.  But when I do this, parts of those
strings disappear*/

data univ_all;
set univ_summary_stats_quant univ_summary_stats_cat;
run ;
%修补


请帮忙

首先,检查您的日志。您的角色变量可能会出现以下警告:

警告:为变量指定了多个长度

在univ_summary_stats_cat中检查字符串的长度。set语句首先具有univ_summary_stats_quant,这可能具有更短的变量长度。这意味着当PDV初始化时,SAS将首先获取该数据集中所有变量的长度。如果univ_summary_stats_cat具有相同的命名变量,它们将被截断为univ_summary_stats_quant中的长度。为了说明这一点,请考虑以下两个数据集:

data one;
    var = 'Hello';
run;

data two;
    var = 'Hi';
run;

data three;
    set two
        one
    ;
run;
三个中的var将被截断为He,因为两个中的var的长度为2,并且被指定为第一个数据集。请注意,日志中还有一个警告

要解决此问题,可以在set语句之前使用length语句手动指定长度,也可以先使用最长字符串长度设置表

data three;
    set one 
        two
    ;
run;

如果问题不在set语句中,而是在merge语句中,则应用相同的逻辑。

首先,检查日志。您的角色变量可能会出现以下警告:

警告:为变量指定了多个长度

在univ_summary_stats_cat中检查字符串的长度。set语句首先具有univ_summary_stats_quant,这可能具有更短的变量长度。这意味着当PDV初始化时,SAS将首先获取该数据集中所有变量的长度。如果univ_summary_stats_cat具有相同的命名变量,它们将被截断为univ_summary_stats_quant中的长度。为了说明这一点,请考虑以下两个数据集:

data one;
    var = 'Hello';
run;

data two;
    var = 'Hi';
run;

data three;
    set two
        one
    ;
run;
三个中的var将被截断为He,因为两个中的var的长度为2,并且被指定为第一个数据集。请注意,日志中还有一个警告

要解决此问题,可以在set语句之前使用length语句手动指定长度,也可以先使用最长字符串长度设置表

data three;
    set one 
        two
    ;
run;

如果问题不在set语句中,而是在merge语句中,则同样的逻辑适用。

谢谢!我刚改变了顺序,问题就解决了。然而,当您说我可以用“length”语句指定字符串长度时,代码行的具体内容是什么?length mycharvar$10。;将添加一个名为mycharvar的字符变量,其固定长度为10字节,其中每个字符都是一个字节。长度mynumvar 8。;将创建长度为8字节的数值变量。有关数值精度和数值变量长度,请参阅SAS文档。这些必须在set语句之前声明,或者在数据步骤中创建变量之前声明。谢谢!我刚改变了顺序,问题就解决了。然而,当您说我可以用“length”语句指定字符串长度时,代码行的具体内容是什么?length mycharvar$10。;将添加一个名为mycharvar的字符变量,其固定长度为10字节,其中每个字符都是一个字节。长度mynumvar 8。;将创建长度为8字节的数值变量。有关数值精度和数值变量长度,请参阅SAS文档。必须在set语句或变量为c之前声明这些 在数据步骤中重新创建。