1

我正在尝试以日期格式读取一些数据,但解决方案却让我望而却步。以下是我使用我能设计的最简单的独立示例的四个尝试。(并且该网站正在让我提高我的文本与代码的比率以便发布,所以请忽略这句话)。

*编辑 - 我的例子太简单了。我的变量中有空格,所以我确实需要指定位置(原始答案说完全忽略位置)。下面的解决方案有效,但日期变量不是日期。

data clinical;
input
name $ 1-13
visit_date $ 14-23  
group $ 25
;
datalines;
John Turner  03/12/1998 D
Mary Jones   04/15/2008 P
Joe Sims     11/30/2009 J
;
run;
4

3 回答 3

1

我的一个朋友建议这样做,但根据变量是否为日期来显着切换语法似乎很奇怪。

data clinical; 
input
name $ 1-12
@13 visit_date MMDDYY10.
group $ 25 ;
datalines;
John Turner 03/12/1998 D
Mary Jones  04/15/2008 P
Joe Sims    11/30/2009 J
;
run;
于 2021-10-13T16:16:47.270 回答
1

无需指定长度。datalines已经采用空格分隔的值。指定信息的一种简单方法是:在每个输入变量之后使用 a。

data clinical;
    input ID$ visit_date:mmddyy10. group$;
    format visit_date mmddyy10.; * Make the date look human-readable;
    datalines;
01 03/12/1998 D
02 04/15/2008 P
03 11/30/2009 J
;
run;

输出:

ID  visit_date  group
01  03/12/1998  D
02  04/15/2008  P
03  11/30/2009  J
于 2021-10-13T15:23:20.643 回答
0

SAS 提供了许多不同的数据输入方式,这取决于您想要做什么。

列 input,这是你开始的,当这是真的时是合适的:

要使用列输入读取,数据值必须具有以下属性:

  • 出现在所有输入数据记录的相同列中
  • 由标准数字形式或字符形式组成

visit_date您的数据在列中不符合此要求。所以,你需要使用别的东西。

当您需要以下功能时,适合使用格式化输入:

对于格式化输入,变量名称后面的信息定义了 SAS 如何读取该变量的值。信息提供输入值的数据类型和字段宽度。Informats 还读取以非标准格式存储的数据,例如压缩十进制或包含逗号等特殊字符的数字。

您的visit_date列符合此要求,因为您有一个特定的信息 ( mmddyy10.),您想使用它来将数据读入日期格式。

在某些情况下,列表输入也可以工作,特别是在修改后的列表格式中,尽管在您的示例中它当然不会因为名称中的空格。这是您可能想要使用它的时候:

列表输入要求您在 INPUT 语句中指定变量名称,其顺序与字段在输入数据记录中出现的顺序相同。SAS 扫描数据线以定位下一个值,但忽略其他中间空白。列表输入不要求数据位于特定列中。但是,除非更改了值之间的分隔符,否则您必须将每个值与下一个值隔开至少一个空格。默认情况下,数据值的分隔符是一个空格或输入记录的结尾。列表输入不会跳过任何数据值来读取后续值,但它可以忽略数据记录中给定点之后的所有值。但是,指针控件使您能够更改读取数据值的顺序。

(为了完整起见,还有 Named input,尽管这种情况比较少见,在这里也没有帮助。)

您可以混合使用 Column 和 Formatted 输入,但您不想混合 List 输入,因为它没有完全相同的指针控制概念,因此很容易得到您不想要的东西。一般来说,您应该使用适合您的数据的输入类型 - 如果您的数据都是文本/常规数字,则使用列输入,如果您的数据具有特定格式,则使用格式化输入。

于 2021-10-14T15:12:45.370 回答