使用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
相关产品推荐
相关产品推荐

