如何将包含变量名的字符串重构为布尔值?
How to refactor string containing variable names into booleans?
我有一个包含以下行的 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)
嵌套到另一个循环中,但没有成功因为它仍然不允许我识别变量号。
我该怎么做?
这对于 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)
将数值转换为两位数字的字符串(带有前导白色 space,其中数字仅由一位数字组成),例如2 -> " 2".
LTRIM()
删除开头的白色space,例如" 2" -> "2".
CONCAT()
连接字符串。在上面的代码中它添加了“|”数字前后,例如“2”->“|2|”
CHAR.INDEX(stringvar,searchstring)
returns 找到搜索字符串的位置。如果未找到搜索字符串,它 returns 0。
CHAR.INDEX(stringvar,searchstring)>0
returns 一个布尔值,表示是否找到搜索字符串。
在 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.
我有一个包含以下行的 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)
嵌套到另一个循环中,但没有成功因为它仍然不允许我识别变量号。
我该怎么做?
这对于 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)
将数值转换为两位数字的字符串(带有前导白色 space,其中数字仅由一位数字组成),例如2 -> " 2".LTRIM()
删除开头的白色space,例如" 2" -> "2".CONCAT()
连接字符串。在上面的代码中它添加了“|”数字前后,例如“2”->“|2|”CHAR.INDEX(stringvar,searchstring)
returns 找到搜索字符串的位置。如果未找到搜索字符串,它 returns 0。CHAR.INDEX(stringvar,searchstring)>0
returns 一个布尔值,表示是否找到搜索字符串。
在 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.