我有一个包含大约1000个变量的数据集。但我想只使用这些变量的一小部分来处理数据集。有什么方法可以删除所有不需要的变量?
使用DELETE VARIABLE
命令,例如
DELETE VARIABLES var1 TO var13 var 15 var 17 TO var var35 ...
会非常烦人且容易出错。
答案 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直接操作数据字典可能会有所帮助。嗯,这就是我的想法。这是我到目前为止所尝试的,或多或少的成功。
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。一个接一个地做很多删除是非常低效的。