我有一个包含以下行的SPSS变量:
|2|3|4|5|6|7|8|10|11|12|13|14|15|16|18|20|21|22|23|24|25|26|27|28|29|
每一行以管道开头,以一行结束。我需要将它重构为布尔变量,如下所示:
var var1 var2 var3 var4 var5
|2|4|5| 0 1 0 1 1
我试过这样的循环:
loop # = 1 to 72.
compute var# = SUBSTR(var,2#,1).
end loop.
exe.
我的代码不适用于2位或更多位数的长数字,也不会将值放入各自的变量中,所以我尝试将char.substr(var,char.rindex(var,'|') + 1)
嵌套到另一个循环中而没有运气,因为它仍然不允许我识别变量号。
我该怎么做?
答案 0 :(得分:0)
对于DO REPEAT
命令来说,这看起来不错。但是类型转换有点棘手:
DO REPEAT var#i=var1 TO var72
/i=1 TO 72.
COMPUTE var#i = CHAR.INDEX(var,CONCAT("|",LTRIM(STRING(i,F2.0)),"|"))>0).
END REPEAT.
说明:让我们从内到外:
STRING(value,F2.0)
将数值转换为两位数的字符串(带有前导空格,其中数字只包含一位数字),例如2 - > " 2" LTRIM()
删除了前导空格,例如" 2" - > " 2" CONCAT()
连接字符串。在上面的代码中,它添加了" |"在数字之前和之后,例如" 2" - > " | 2 |" CHAR.INDEX(stringvar,searchstring)
返回搜索字符串的位置。如果找不到搜索字符串,则返回0。CHAR.INDEX(stringvar,searchstring)>0
返回一个布尔值,指示是否找到了搜索字符串。答案 1 :(得分:0)
在Python中进行操作比使用本机SPSS语法更容易。
您可以使用SPSSINC TRANS
扩展名来实现此目的。
/* Example data*/.
data list free / TextStr (a99).
begin data.
"|2|3|4|5|6|7|8|10|11|12|13|14|15|16|18|20|21|22|23|24|25|26|27|28|29|"
end data.
/* defining function to achieve task */.
begin program.
def runTask(x):
numbers=map(int,filter(None,[i.strip() for i in x.lstrip('|').split("|")]))
answer=[1 if i in numbers else 0 for i in xrange(1,max(numbers)+1)]
return answer
end program.
/* Run job*/.
spssinc trans result = V1 to V30 type=0 /formula "runTask(TextStr)".
exe.