我有一些.sav文件,我想检查坏数据。坏数据的含义与问题无关。我已经在python中使用spss模块编写了一个脚本来检查案例,如果它们不好就删除它们。我通过定义数据集对象然后获取其案例列表在datastep中执行此操作。然后我用
del datasetObj.cases[k]
删除datastep中的有问题的案例。
这是我的问题:
假设我有一个数据集foo.sav并且它是spss中的活动数据集,那么我可以运行类似的东西:
BEGIN PROGRAM PYTHON.
import spss
spss.StartDataStep()
datasetObj = spss.Dataset()
caselist = datasetObj.cases
del caselist[k]
spss.EndDataStep()
END PROGRAM.
从spss客户端内部,它将从数据集foo.sav中删除案例k。但是,如果我使用foo.sav目录作为工作目录运行类似下面的内容:
import os, spss
pathname = os.curdir()
foopathname = os.path.join(pathname, 'foo.sav')
spss.Submit("""
GET FILE='%(foopathname)s'.
DATASET NAME file1.
DATASET ACTIVATE file1.
""" %locals())
spss.StartDataStep()
datasetObj = spss.Dataset()
caselist = datasetObj.cases
del caselist[3]
spss.EndDataStep()
从命令行,它不会删除案例k。获取值的类似代码将正常工作。例如,
print caselist[3]
将打印案例k(当它在数据步骤中时)。我甚至可以更改案例的各个条目的值。但它不会删除案件。有什么想法吗?
我是python和spss的新手,所以可能有一些我没有看到的东西对其他人来说是显而易见的;因此我问这个问题的原因。
答案 0 :(得分:0)
你的第一段代码对我不起作用。我把它调整如下以使它工作:
BEGIN PROGRAM PYTHON.
import spss
spss.StartDataStep()
datasetObj = spss.Dataset()
del datasetObj.cases[k]
spss.EndDataStep()
END PROGRAM.
请注意,在您的代码中,caselist
只是一个列表,包含从SPSS中的datasetObj获取的值。属性.cases
属于datasetObj
。
使用spss.Submit
,您还可以使用SPSS命令SELECT IF
删除案例(或实际上,不选择它们)。例如,如果您的文件具有名为age
的变量(列),其值介于0到100之间,则可以删除年龄低于(SPSS:lt
或{{1)的所有案例使用:
<
不要忘记添加一些代码来保存编辑过的文件。
答案 1 :(得分:0)
caselist实际上不是包含数据集值的常规列表。虽然它的接口是列表接口,但它实际上直接与数据集一起工作,因此它不包含值列表。它只访问SPSS端的操作以检索,更改或删除值。最重要的区别是,由于统计数据不会将数据保留在内存中,因此案例列表的大小不受内存限制。
但是,如果您尝试使用
循环遍历案例
范围(spss.GetCaseCount())
并删除一些,循环最终将失败,因为实际的案例计数反映了删除,但循环限制不反映。如果先前的案例已被删除,那么datasetObj.cases [k]可能不是您所期望的。因此,您需要跟踪删除并适当调整限制或k值。
HTH