多语言调查数据集合并:因子变量统一与转换的技术问询
多语言调查数据合并解决方案
示例数据
fr <- expand.grid( ques = factor(rep(c("oui", "non"), each=2)), gender = factor(rep(c("femme", "homme"), each=2)), chr = rep(c("c", "g"), times=1) ) en <- expand.grid( ques = factor(rep(c("yes", "no"), each=2)), gender = factor(rep(c("man", "woman"), each=2)), chr = rep(c("c", "g"), times=1) ) fr$chr <- as.character(fr$chr) en$chr <- as.character(en$chr)
问题解决步骤
1. 高效提取所有因子变量的水平
不用逐个手动查看,写个函数批量提取数据框内所有因子变量的水平:
# 提取单个数据框的因子水平 get_factor_levels <- function(df) { lapply(df[, sapply(df, is.factor)], levels) } # 快速比对法、英数据的因子水平 get_factor_levels(fr) get_factor_levels(en)
2. 统一因子水平顺序(保证跨语言编码一致)
调整因子水平顺序,让不同语言的同义选项对应相同数值编码:
# 调整法语gender水平顺序,匹配英语man/woman的对应关系 fr$gender <- factor(fr$gender, levels = c("homme", "femme")) # 调整法语ques水平顺序,匹配英语yes/no的对应关系 fr$ques <- factor(fr$ques, levels = c("oui", "non"))
3. 因子转数值并合并数据
按原逻辑转换为数值型后合并,建议新增语言标识列方便后续溯源:
library(dplyr) fr.1 <- fr %>% mutate(across(where(is.factor), as.numeric)) en.1 <- en %>% mutate(across(where(is.factor), as.numeric)) # 合并并添加语言标签 multi <- rbind.data.frame( cbind(fr.1, lang = "fr"), cbind(en.1, lang = "en") )
4. 将合并后的数值转回英文因子水平
这一步完全可行,基于英语的因子水平做批量映射转换:
# 提取英语数据的因子水平作为映射规则 en_levels <- get_factor_levels(en) # 批量将数值列转回英语因子 multi_final <- multi %>% mutate(across( all_of(names(en_levels)), # 仅针对原因子变量列 ~ factor(.x, levels = seq_along(en_levels[[cur_column()]]), labels = en_levels[[cur_column()]]) )) # 查看最终结果结构 str(multi_final)
内容的提问来源于stack exchange,提问作者Heather Clark
相关产品推荐
相关产品推荐

