去年我帮一个学生处理消费者调研数据,他把线上问卷和线下问卷分别录成了两个SPSS文件,问我要怎么做成一整份。我说这还不简单,菜单里点几下就完了,结果他跑回去折腾了半天,回来跟我说合并出来的数据要么行数不对,要么列数对不上,差点把论文数据搞坏。
其实数据合并这事,听起来简单,做起来到处是坑。SPSS里的数据合并主要有两种形态:一种是增加行,把多个文件中的个案上下堆到一起,叫纵向合并;另一种是增加列,把两个文件中同一个人的不同信息左右拼到一起,叫横向合并。这两类操作在SPSS里都能通过菜单完成,可一旦数据量上来、变量一多,各种细节问题就会冒出来。这篇文章我把自己实际用SPSS合并数据的流程、踩过的坑、排查思路都整理出来,给刚好要处理问卷数据、实验数据或者做论文数据分析的同学做个参考。
1. 先搞明白:你手里的数据到底该纵向合并还是横向合并
很多新手一上来就点菜单,点完发现结果不对,原因基本都是没想清楚数据结构。SPSS里数据的组织形式是典型的“行列结构”:一横排是一个个案(Case),一竖列是一个变量(Variable)。所谓“纵向”和“横向”合并,动的就是这两个维度。
纵向合并,英文菜单里叫 Add Cases,本质是“追加个案”。比如你分三次收集问卷,每次是一个独立的SAV文件,每份都有200条记录,横向结构一样,现在要把三份拼成一份600条的完整数据,这就是纵向合并。它只增加行数,不增加列数。
横向合并,英文菜单里叫 Add Variables,本质是“匹配变量”。比如你手里有一份问卷数据,里面有每个人的测评得分,另外还有一份录入好的人口学资料,同样有每个人的ID、性别、年龄,现在要把两份数据按ID对应起来,让得分和人口学信息待在同一行里,这就是横向合并。它增加的是列数,不增加行数。
可以简单记成:如果新数据文件带来的信息是“新的人/新的记录”,用纵向合并;如果新数据文件带来的是“同一个人/同一条记录的新属性”,用横向合并。这两种合并在SPSS里对应的操作路径都在 Data 菜单下的 Merge Files 子菜单里,但前置条件和检查点完全不同。
2. 纵向合并实操:把散落的数据文件追加成一份完整数据
2.1 纵向合并的适用场景和前置条件
纵向合并出现得最多的地方是问卷回收。现在很多问卷是线上回收一批、线下面访又回收一批,数据分别从不同的后台导出;还有些情况是调研跨了好几个城市,每个城市分别录了一份表;或者实验室做批量实验,每周导出一份成绩文件,最后要汇总结论。
在做纵向合并之前,你至少要确认三件事:
第一,变量名必须一致。SPSS合并时靠的是变量名来识别同一个变量,不靠位置。你在A文件里把性别叫做 gender,在B文件里却叫 sex,那么合并后就会变成两个变量,而且其中一个全是缺失值。第二,变量类型必须一致。如果一个文件里“年龄”是数值型,另一个文件里“年龄”是字符串型,SPSS也会把它们当作两个不同变量,因为在SPSS的底层逻辑里,名字和类型共同决定一个变量。第三,所有文件里同一变量的含义和取值编码必须一致。我在实际中见过最头疼的情况,就是一个文件里1代表男、2代表女,另一个文件里0代表男、1代表女,合并之后你根本分不清哪些人是什么性别。
所以在导入外部数据时,我一般会先点开 Variable View 逐列检查一遍变量名、类型、宽度、值标签,再决定要不要合并。这步看起来繁琐,但能省掉后期大量返工。
2.2 菜单操作步骤:Add Cases 的完整流程
在一个SAV文件已经打开的前提下,依次点击菜单 Data -> Merge Files -> Add Cases,然后在弹出窗口中选择要合并进来的第二个文件。这里有个容易忽略的细节:SPSS里当前打开的那个文件被称为活动数据集,合并的时候新建的结果文件会以它为基础,另一个文件被拼接进来。所以选择哪个文件作为“当前打开文件”,会影响到最终变量排列的先后顺序。
点击继续之后,SPSS会弹出设置对话框。框里左边是两个文件中都能自动匹配上的变量列表,已经帮你排进了“Variables in New Active Dataset”;右边是没能匹配上的变量列表,叫 Unpaired Variables。如果某个变量只在其中一个文件里存在,它就会出现在未配对区域,需要你手动选中、点箭头移到新数据集的变量列表里,否则合并后这个变量会丢失。
这里我给自己定了一个强制动作:勾选 Indicate case source as variable,也就是生成一个来源标记变量。这个变量会用0和1记录每条个案来自哪个文件,在后期如果你发现某批数据有问题要追溯来源、或者想单独筛出某批样本做稳健性检验,就会非常方便。如果你合并的不止两个文件,我更建议每合并一次都保留来源标记,最后形成一个类似 batch 的变量,既能看到数据分层,也能在检查异常时快速定位。
确认完变量设置后点 OK,SPSS会自动生成一个新数据集视图,里面就是合并后的结果。你可以在新输出中看到一行合并日志,注意看最后报告的个案总数。如果原来是320条和80条,合并后一定要看到400条,这是最简单的一层校验。
2.3 一个完整案例:线上线下问卷合并的全过程
我拿一个实际做过的案例来演示。当时有一项消费者偏好调查,线上平台回收了320份有效问卷,数据导出后文件命名为 online.sav;线下逛展拦截访问回收了80份,录入后命名为 offline.sav。两份文件都包含这些变量:id、city、gender、age、annual_income、q1到q12、total_score。
我先打开 online.sav,进入 Variable View,把两个文件的变量名逐一比对。线下那份里有个变量叫 age_group,而线上这份里叫 age,意思是年龄组,但名字不同,如果直接合并,SPSS会生成两个变量,这显然不是我要的。于是我先在 offline.sav 里把 age_group 重命名为 age,再保存,确保两个文件的变量名能对得上。
然后我执行 Data -> Merge Files -> Add Cases,选择 offline.sav,这时13个变量全部自动配对成功。我勾选了来源标识选项,并把新变量名改成 data_source。合并完成后,我看输出窗口显示“Result is 400 cases, 15 variables”,和前期的320+80对上了,然后我又顺手跑了一次 gender 的频数分析,拿合并后的结果和之前两份文件分别算出的男女比例做了交叉对比,确认数值没有异常偏移。
纵向合并后还要注意一件事:数据文件中往往存在重复ID,尤其是分批次录入的问卷,如果废卷没有剔除干净,合并后同一个ID可能出现多条记录。这时可以借助 Data -> Identify Duplicate Cases,把 id 设置为关键变量来逐个排查。这不算合并本身的漏铜,但合并是一个“让重复问题显形”的动作,所以处理完合并后,最好顺手做一次重复记录检查。
2.4 附赠:语法模板
如果你习惯写语法,纵向合并也完全可以脱离菜单。SPSS的语法是:
ADD FILES /FILE=* /FILE='D:\data\offline.sav' /IN=Source. EXECUTE.这里的 /IN=Source 就是生成来源变量的作用,等价于菜单里勾选 Indicate case source as variable。语法跑出来的结果和在菜单里点是一样的,好处是你可以把合并流程保存成一个 .sps 文件,下次换数据时只需要改文件路径,不用再点一遍菜单。
3. 横向合并实操:按ID给每一条个案补全信息
3.1 横向合并的适用场景和前置条件
横向合并在问卷研究里也极其常见。比如你手头有两份文件:一份是问卷回收数据,包含了受访者的id和几十道题目的得分;另一份是清洗整理过的人口学背景信息,包含id、性别、年龄、学历、收入。这时候你想把两份数据合成一份完整的分析数据,就得按id横向合并。
还有一种常见场景是纵向追踪。比如基线调查和随访调查分别存储,每个人在两次调查中都有记录,通过id把人匹配起来,把第一次的结果和第二次的结果并排放在同一行里,才能做前后对比分析。
横向合并需要注意的前置条件比纵向合并更严格。核心是必须有一个或者一组变量能够唯一标识每一行,叫做键变量。这个键变量在两个文件里的名字要完全一致,类型也要一致。比如身份证号在A文件里是字符串类型,在B文件里却是数值型,这里的坑在于:如果号码是18位,数值型会丢失精度,甚至变成科学计数法;如果以0开头的编号,数值型直接就把开头的0给吞了。所以身份证号、学号这类长编号,我建议统一定义成字符串类型,再去做合并。
此外,横向合并还有一个很多人不知道的硬性要求:如果要用键变量匹配,两个文件都必须先按这个键变量排好序。SPSS这种合并方式并不是数据库里的hash join,它是一次性顺序扫描,两个文件都按相同顺序排列才能正确匹配。你在菜单里选择匹配键变量后,SPSS会提示是否需要按关键变量排序,如果文件已经排好了,自己直接选“文件已排序”就行。
3.2 菜单操作步骤:Add Variables 的关键决策点
假设你的活动数据集是包含问卷得分的 qdata.sav,要匹配的是背景信息的 demo.sav,两边都有 id。操作路径是 Data -> Merge Files -> Add Variables,然后选择 demo.sav 作为要合并进来的文件。
进入匹配设置对话框后,最关键的步骤是把 id 从左边变量列表中选中,移到下方 Key Variables 框里。移动进去后,SPSS就会认为你希望以id为键来进行匹配。如果没有指定任何键变量,SPSS会直接按照行位置对齐合并,这非常危险——只要两个文件行数不一样或者顺序对不上,合并之后数据就全乱了。
接下来要处理重复变量名。如果两个文件里除了id之外,还有其他同名变量,比如都有 a_income 这样一个意思相同但数据来源不同的变量,SPSS在合并设置里会要求你处理这些冲突。最简单的办法是先在其中一个文件里重命名,比如把demo.sav里的 a_income 改成 a_income_demo,这样合并后的数据能保留两个列的原始信息,后续分析时你自己决定用哪个。
还有一个复选框叫 Non-active dataset is keyed table,这个选项在“一对一匹配”场景下一般不用勾选,但当活动数据集是一个明细表、非活动数据集是一个主数据表时就需要考虑。举个例子,你正在处理一张订单表,每行是一条订单记录,同一客户会出现多次;而另一张表是客户主档,每个客户一行。你要把客户的城市、会员等级补到订单表里,这就是多对一匹配。SPSS在这种情况下要求你把非活动数据集标记为主表(keyed table),它才知道非活动数据集中每一行只能参与一次匹配。
3.3 一个完整案例:问卷得分和人口学信息的依ID匹配
我用一个标准案例演示一遍完整流程。qdata.sav 里是200名被试者的11道量表题目q1到q11和一个总分 total_score;demo.sav 里是这200人的人口学信息,包括id、gender、age、education、income、city。两个文件都是200行,且id不重复。
我先在 qdata.sav 里用 Data -> Sort Cases 按 id 排序,同样也对 demo.sav 按 id 排序。如果你觉得在Excel里排好再导入也可以,但既然数据都在SPSS里了,直接在这里排更快。接着执行 Data -> Merge Files -> Add Variables,选择 demo.sav,在匹配设置中把 id 移入 Key Variables,因为两边变量名完全一致且都是数值型,没有重复变量冲突,直接点 OK。
合并完成后,新数据集的列数应该是原来的问卷变量数量加上demo文件中的新变量数量,行数应该保持200行不变。看到有新增的gender列,我还会再跑一次交叉表,比如 Crosstab of gender by city,看看有没有明显的不合理缺失。如果出现大量缺失,基本可以断定是id匹配失败,要回头检查id的格式。
横向合并的正确结果必须是:行数不变、列数增加、每一行的id顺序不影响对应关系。如果合并后行数莫名其妙变多了,那你就要警惕是不是两个文件里有重复id,尤其是那种一个人占两行的数据,这时合并起来会“一对多”,产生笛卡尔积式的膨胀,个案数会成倍增长。
3.4 附赠:语法模板
横向合并菜单版对应的SPSS语法是:
MATCH FILES /FILE=* /FILE='D:\data\demo.sav' /BY id. EXECUTE.在这个语法里,/BY 后跟的就是键变量名。如果你合并时希望把非活动数据集当主表用,那么:
MATCH FILES /FILE=* /FILE='D:\data\customer_master.sav' /TABLE='D:\data\customer_master.sav' /BY customer_id. EXECUTE.其实 /TABLE 参数就对应菜单中“非活动数据集是键表”的语义,这个语法很值得掌握。
4. 合并过程中的常见问题与排查技巧实录
4.1 变量名对不上,合并后全变成缺失
这是纵向合并最典型的问题。SPSS里同一个变量在两个文件中叫法不同时,它不会帮你智能识别,而是把两个变量当成无关变量处理。你合并后一看,新数据集里多了一列,旧的那列全是缺失。
排查思路:合并前打开两个文件,进 Variable View,把变量名、类型一一对照。如果两个文件变量很多,可以先把两份变量清单分别导出,在Excel里用VLOOKUP做一次差异比对,这样很快就能找出哪些变量名不一致、哪些只在一个文件里出现。
如果两份文件实际含义相同但变量名不同,我的建议是先在副文件里重命名,再执行合并,权重最好放在副文件的属性上,毕竟主文件已经设计好变量命名规则了。
4.2 合并后个案数暴涨或莫名对不上
横向合并时个案数暴涨,最常见的原因就是键变量有重复。比如你按 id 合并,但demo.sav里有些id出现了两次,合并时每一条订单记录都会匹配这两个重复id,结果行数成倍增加。这时应该先对非活动数据集做一次重复检查:Data -> Identify Duplicate Cases,选id作为分组依据,看一下重复记录数量。如果有重复,你需要先解决业务上的重复记录问题,再来合并。
纵向合并后行数少了,则往往是数据导入时文件本身就存在缺失,或者两个文件里有一批重复个案被识别为同一条。还有一种情况是SPSS在合并时将其中一列长度不同的字符串变量强行截断,你可以观察结果文件变量类型是否被调整,必要时重新定义字符串长度后再合并。
值得一提的是“数据不一致”这个热词也常和合并一起被人搜索。我认为合并后最容易出现的数据不一致,其实是两个文件对同一个变量的编码口径不同。比如一个文件里 q1 的取值范围是1到7,另一个文件里同一题是0到6,这种差异不会让合并报错,但会污染全部后续分析。所以合并后一定要做描述性统计,看取值范围、均值是否处于合理区间,不能只看行数对不对。
4.3 变量类型和宽度不一致,导致无法配对
SPSS的合并逻辑要求变量名和类型都一致,才能把两个变量识别为同一个。如果A文件里“年龄”是数值型(numeric),B文件里“年龄”是字符串型(string),系统会提示类型不一,这时候你需要做一次转换。转换很直接:对于年龄这种本身就是数字的字段,可以使用 Compute Variable 或者在Variable View里改类型时选择“将字符串转换为数值”的提示。但要注意,如果字符串变量里混入了非数字字符,如空字符串或“不详”,转换后可能变成系统缺失值,要提前清理。
字符串宽度问题也同样容易被忽略。两个文件里同一个字符串变量,一个定义为宽度10,另一个定义为宽度20,虽然名字一样、类型一样,但宽度不同也可能引起合并异常。为避免这类低级事故,合并前最好进 Variable View 统一一下宽度,尤其是城市名、地址这类文本变量。
4.4 用菜单合并太慢,文件还特别大
很多人处理几十万行的大数据文件时,SPSS的菜单操作会显得很卡。这里有两个优化思路。一是合并前把不需要的变量先扔掉,只保留合并必需变量和分析必需变量,需要时再重新把全量变量合并回来。二是优先使用语法执行合并,语法方式比菜单点击少一层图形界面的交互开销,对大文件更友好。
有些场景下数据量大到SPSS内存吃紧,还可以考虑先导出一个轻量级的CSV,在数据处理工具里完成合并后再导回SPSS。不过我不太建议常态这样干,因为CSV会丢失值标签、变量类型等元数据,折腾一圈可能损失数据字典信息,除非实在没有别的办法。
4.5 几个我自己踩过的坑
说两个教科书里不讲的坑。第一个是纵向合并时,活动数据集里有很复杂的值标签,比如变量gender的值标签是1=男、2=女,而副文件里根本没有任何值标签定义,合并后SPSS默认使用活动数据集的值标签,这是好事。但如果副文件里的1代表女、2代表男,值标签虽然没变化,底层取值含义却已经变了。所以值标签要检查,但更关键的是检查取值本身。
第二个坑是合并后工作文件默认没有保存。SPSS所有这些合并操作生成的都是一个新的数据集视图,你自己的原文件依然在原位置没动。很多新手合并完直接去做后续分析,分析到一半发现结果不对,回头一看SPSS报错了或者软件崩了,合并结果全丢。所以合并完第一件事就是 File -> Save As,用一个新的文件名保存。
5. 合并前后养成这几种工作习惯,能少交很多学费
5.1 合并前做备份,合并后做校验
我现在的固定流程是:给每个项目建一个数据管理的文件夹,里面分三个子目录:raw(原始数据)、working(处理中数据)、analysis(最终分析数据)。任何合并操作,我都是在 working 目录下做,raw 里的文件永远不去动它。这样,哪怕合并出错了,我随时可以退回去重新来。
合并后的校验,我一般是两套交叉验证。第一套是数量校验:纵向合并看行数是否等于多个文件之和,横向合并看行数是否等于非活动的表行数,同时看列数是否有预期变化。第二套是质量校验:拿两三个核心变量分别跑一遍频数或描述统计,对比合并前后关键指标是否一致。比如纵向合并后,把gender的频数百分比跟合并前分别计算出来的结果对一遍,如果某个组别的占比明显变了,很可能有一个文件的编码口径错了。
5.2 做一张数据字典给自己看
数据合并的底层是变量管理,而变量管理最需要的是数据字典。不需要多复杂,Excel里一个表就够了:变量名、变量中文含义、类型、宽度、取值编码说明、来源文件、备注。
我过去一年里因为不做数据字典吃过的亏,至少有两次。一次是合并后发现一个变量名 q8 在两个文件里含义不同,一个来自满意度量表,一个来自行为频率题,结果我前期已经把它当成同一个变量跑了好几个模型;另一次是几个月后回看数据,完全想不起来某个变量的取值范围代表什么。后来索性在每次合并前先把数据字典打开,逐项检查,靠这个习惯把问题拦在了前面。
5.3 双人复核和大文件拆分处理
在做正式报告的合并数据时,我还会请一个同事用同样的数据、同样的合并逻辑做一遍,然后我们把合并后的两个结果文件放在一起比较关键变量的描述统计。这种方法在统计软件里其实就是最简单的“双人复核”,成本低、效果好,尤其适合有明确规定的研究项目。大文件处理上,如果源数据有两个以上的批次,别一次全合并进去。先拿一个小样本跑通流程,比如先合并两个批次,确认变量匹配没问题,再把剩余批次追加进来,这样一旦出问题,范围也可控。
我这几年带新手处理数据时,发现他们最常犯的错就是“路径不对”。这里的路径不单指文件路径,还包括分析的路径。很多人一上来就着急点合并按钮,脑子里没有想清楚数据该增加行还是增加列,匹配的键是哪个,文件有没有排好序,结果问题一个接一个。数据合并本身不难,难的是在动手之前把数据结构和业务含义想明白。
如果你现在正要合并一批数据,我建议你多花十分钟做一件事:把两个文件的变量列表并排放在一起,把键变量、匹配方式、合并后需要保留的变量都标出来,然后再去点菜单。数据合并这门手艺,慢就是快。