从SPSS中的数据集中删除除少数变量之外的所有变量

时间:2014-11-07 13:43:43

标签: python spss

我有一个包含大约1000个变量的数据集。但我想只使用这些变量的一小部分来处理数据集。有什么方法可以删除所有不需要的变量?

使用DELETE VARIABLE命令,例如

DELETE VARIABLES var1 TO var13 var 15 var 17 TO var var35 ...

会非常烦人且容易出错。

2 个答案:

答案 0 :(得分:4)

示例数据

DATA LIST LIST (",") /
make (A18) price (F4) mpg (F2) rep78 (F1) hdroom (COMMA1.1) 
trunk (F2) weight (F4) length (F3) turn (F2)
displ (F3) gratio (COMMA2.2) foreign (F1) .

BEGIN DATA.
AMC Concord,        4099,   , 3, 2.5, 11, 2930, 186, 40, 121, 3.58, 0
AMC Pacer,          4749,   , 3, 3.0, 11, 3350, 173, 40, 258, 2.53, 0
AMC Spirit,         3799,   , 3,  .0, 12, 2640, 168, 35, 121, 3.08, 0
Audi 5000,          9690, 17, 5, 3.0, 15, 2830, 189, 37, 131, 3.20, 1
Audi Fox,           6295, 23, 3, 2.5, 11, 2070, 174, 36,  97, 3.70, 1
BMW 320i,           9735, 25, 4, 2.5, 12, 2650, 177, 34, 121, 3.64, 1
Buick Century,      4816, 20, 3, 4.5, 16, 3250, 196, 40, 196, 2.93, 0
Buick Electra,      7827, 15, 4, 4.0, 20, 4080, 222, 43, 350, 2.41, 0
Buick LeSabre,      5788, 18, 3, 4.0, 21, 3670, 218, 43, 231, 2.73, 0
END DATA.

    DATASET NAME cars.

假设您要提取变量 make trunk turn

保存文件(和获取文件)

如果您想保留简化数据集供以后使用,显而易见的方法是使用/KEEP命令中的SAVE选项。

SAVE OUTFILE='cars.sav'
   /KEEP make trunk turn.

另一方面,如果要打开仅包含变量子集的现有数据集,可以使用带有GET FILE选项的/KEEP命令。

匹配文件

如果您只想临时使​​用简化数据集而不将其存储到硬盘驱动器,则此方法很有用。

MATCH FILES 
/FILE *
/KEEP make trunk turn.

Python VariableList类

如果您拥有非常庞大的数据集,则上述方法可能需要一些时间,因为它们会读取(并写入)所有数据。在这种情况下,使用Python直接操作数据字典可能会有所帮助。嗯,这就是我的想法。这是我到目前为止所尝试的,或多或少的成功。

BEGIN PROGRAM PYTHON.
keepList = ["make", "trunk", "turn"]

import spss

spss.StartDataStep()
datasetObj = spss.Dataset('cars')
varListObj = datasetObj.varlist
varList = [var.name.encode('utf8') for var in varListObj]
datasetObj.close()
spss.EndDataStep()
deleteList = [item for item in varList if item not in keepList]
spss.Submit("DELETE VARIABLES %s." % " ".join(deleteList))

END PROGRAM

注意:这段代码仅在您的删除变量列表不长于100时才有效(此错误应在SPSS v23或更高版本中修复)。否则你必须将列表拆分成单独的部分。我通过将spss.Submit-line替换为:

来尝试这个
chunks = 100
for i in xrange(0, len(deleteList), chunks):
   spss.Submit("DELETE VARIABLES %s." % " ".join(deleteList[i:i+chunks]))

问题在于,即使程序块在大数据集上运行速度很快,但事实证明,在此块之后,每次执行命令都会因内存泄漏而导致速度变慢。

答案 1 :(得分:1)

更快更简单,只需使用Python逻辑构建DELETE VARIABLES命令并执行SPSS.submit。一个接一个地做很多删除是非常低效的。