You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R语言intsvy包合并PISA 2015数据时遇重复标签错误求助

解决intsvy合并PISA2015数据时的「Duplicate labels」错误

问题描述

我用intsvy包分析PISA数据,尝试通过pisa.select.merge()合并2015年学生文件与学校文件时,突然出现「Duplicate labels」错误。这段代码过去两个月一直正常运行,如今却报错。我原本以为合并功能可识别并合并带有相似标签的两个数据集,已尝试删除并重新下载原始PISA数据文件,也卸载重装了intsvy包与RStudio,但问题仍未解决。

代码示例

library(intsvy)

PISA2015 <- pisa.select.merge(folder = "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets",
                              school.file = "2015_SCHQ.sav",
                              student.file = "2015_STUQ1.sav",
                              student = c("ESCS", "PARED"), 
                              school = c("CLSIZE", "SCHSIZE"),
                              countries = c("PRT"))

报错信息

File character set is 'WINDOWS-1252'.
Converting character set to UTF-8.
File character set is 'WINDOWS-1252'.
Converting character set to UTF-8.
Error in as.factor(x) : Duplicate labels
In addition: Warning messages:
  1: 11 variables have duplicated labels:
  CNTRYID, Region, STRATUM, SUBNATIO, ST011D17TA, ST011D18TA,
ST011D19TA, PROGN, OCOD1, OCOD2, OCOD3 
2: 4 variables have duplicated labels:
  CNTRYID, Region, STRATUM, SUBNATIO 

解决方案

1. 手动读取并合并数据,绕开intsvy的自动标签处理

从警告可知,学生和学校数据集存在重复标签的变量(如CNTRYID、Region),这些变量可能在两个文件中标签文本重复,导致intsvy的合并函数触发错误。可以手动读取数据并筛选变量后合并:

library(foreign)

# 分别读取学生和学校数据,不自动转换为带标签的因子
student_data <- read.spss(
  "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_STUQ1.sav",
  use.value.labels = FALSE,
  to.data.frame = TRUE,
  reencode = "UTF-8"
)
school_data <- read.spss(
  "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_SCHQ.sav",
  use.value.labels = FALSE,
  to.data.frame = TRUE,
  reencode = "UTF-8"
)

# 筛选需要的变量,保留合并键(CNTRYID、SCHOOLID)
student_subset <- student_data[, c("CNTRYID", "SCHOOLID", "ESCS", "PARED")]
school_subset <- school_data[, c("CNTRYID", "SCHOOLID", "CLSIZE", "SCHSIZE")]

# 手动合并数据集
PISA2015 <- merge(student_subset, school_subset, by = c("CNTRYID", "SCHOOLID"), all.x = TRUE)

合并完成后,可继续用intsvy的其他函数处理数据(如设置分析权重)。

2. 修复数据中的重复标签后再调用intsvy合并函数

用haven包读取SPSS文件,修复重复的因子标签后保存,再用pisa.select.merge()读取合并:

library(haven)

# 读取原始数据
student_data <- read_sav("/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_STUQ1.sav")
school_data <- read_sav("/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_SCHQ.sav")

# 修复学生数据中的重复因子标签
for (var in names(student_data)) {
  if (is.factor(student_data[[var]])) {
    levels(student_data[[var]]) <- make.unique(levels(student_data[[var]]))
  }
}

# 修复学校数据中的重复因子标签
for (var in names(school_data)) {
  if (is.factor(school_data[[var]])) {
    levels(school_data[[var]]) <- make.unique(levels(school_data[[var]]))
  }
}

# 保存处理后的文件
write_sav(student_data, "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_STUQ1_clean.sav")
write_sav(school_data, "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets/2015_SCHQ_clean.sav")

# 调用合并函数
PISA2015 <- pisa.select.merge(folder = "/Users/x/Desktop/x/EPICER/Analysis/R Script and Supporting Datasets",
                              school.file = "2015_SCHQ_clean.sav",
                              student.file = "2015_STUQ1_clean.sav",
                              student = c("ESCS", "PARED"), 
                              school = c("CLSIZE", "SCHSIZE"),
                              countries = c("PRT"))

3. 回退到intsvy旧版本

若问题是新版本intsvy对标签处理更严格导致的,可尝试安装旧版本的包:

# 先安装devtools(如果没装过)
install.packages("devtools")
library(devtools)

# 安装指定版本的intsvy,这里以2.3为例(根据你之前正常运行时的版本调整)
install_version("intsvy", version = "2.3")

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:04:58