You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS中使用INPUT语句末尾'@'前置条件创建观测的疑问

解决列表输入中用@配合条件筛选观测的问题

好问题!你已经摸透了列输入里用@锁定输入行、配合条件筛选观测的技巧,但列表输入因为是按空白分隔读取的特性,直接照搬列输入的写法就会踩坑——咱们先搞清楚为什么你的第二个代码会报错,再给你几个可行的解决方案。

为什么你的列表输入代码会失败?

看LOG里的错误就明白:第一个input height @;会尝试读取每行的第一个值(比如第一行的Deepak),但height是数值型变量,字符转数值直接失败,height变成缺失值,后续if height = 6的条件永远不满足,而且输入指针的位置也完全乱了,导致后面的变量都读不到正确值。

解决方案1:调整数据顺序(最简单的方法)

如果能把height放到每行的开头,列表输入就能正确识别数值,然后用@锁定行、判断条件,再读后续变量:

data new;
 input height @; /* 先读开头的数值height,用@锁住当前行 */
 if height = 6; /* 只保留height=6的观测 */
 input name $ colour $ place $; /* 读取剩下的字符变量 */
 datalines;
6 Deepak Red Delhi
5 Aditi Yellow Delhi
5 Anup Blue Delhi
5 Era Green Varanasi
5 Avinash Black Noida
5 Vivek Grey Agra
;
run;

解决方案2:不修改数据,用_INFILE_提前提取判断条件

如果没法调整原始数据的顺序,就用SAS的_INFILE_自动变量(它会存储当前读取的整行内容),配合字符串函数提前提取height的值,判断后再读取所有变量:

data new;
 infile datalines truncover;
 input @; /* 先锁住当前行,不让指针跳到下一行 */
 /* 提取每行第4个空白分隔的元素,转成数值型height */
 height = input(scan(_INFILE_, 4), best.);
 if height = 6; /* 筛选符合条件的观测 */
 /* 正常读取所有变量,此时指针还在当前行开头,不会出错 */
 input name $ colour $ place $ height;
 datalines;
Deepak Red Delhi 6
Aditi Yellow Delhi 5
Anup Blue Delhi 5
Era Green Varanasi 5
Avinash Black Noida 5
Vivek Grey Agra 5
;
run;

这里的scan(_INFILE_, 4)是取每行第4个空白分隔的内容,刚好对应你的数据里的height位置;如果你的数据里height的位置有变化,只要改scan的第二个参数就行。

核心思路总结

列表输入的本质是按空白分隔符读取变量,所以要确保:

  • 要么让需要先判断的变量(比如height)出现在行首,能被正确识别类型;
  • 要么先通过_INFILE_提前提取判断值,再执行后续的输入操作。

内容的提问来源于stack exchange,提问作者user9787975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:15