在R中利用不同维度查找表生成逻辑变量的问题
解决方法:为个体匹配对应国家的官方语言
问题原因分析
你之前的代码出错,核心是向量长度不匹配导致的向量化运算逻辑错误:
- 第一种尝试中,
languages$lcntry == cntry会将长度为7的cntry向量和长度为5的languages$lcntry做广播比较,得到的是5×7的布尔矩阵,取子集时逻辑混乱,结果自然不对。 - 第二种尝试里,
filter(languages, lcntry == cntry)中,cntry是整个列的7个值,而languages只有5行,dplyr要求筛选条件的长度必须等于数据框行数或为1,因此报错。
三种可行解决方案
方案1:先整理 lookup 表再连接(推荐,大数据场景高效)
先将languages整理为「国家-官方语言列表」的映射表,再与individuals连接后判断:
library(dplyr) # 生成国家-官方语言列表的映射 lang_lookup <- languages %>% group_by(lcntry) %>% summarise(official_langs = list(llang), .groups = "drop") # 连接并判断语言是否属于对应国家的官方语言 individuals <- individuals %>% left_join(lang_lookup, by = c("cntry" = "lcntry")) %>% mutate(natlang = lang %in% unlist(official_langs)) %>% select(-official_langs)
方案2:逐行处理(rowwise)
用rowwise()让mutate逐行执行,此时每个行的cntry是单个值,filter能正确筛选对应国家的官方语言:
library(dplyr) individuals <- individuals %>% rowwise() %>% mutate(natlang = lang %in% filter(languages, lcntry == cntry)$llang) %>% ungroup()
方案3:用purrr逐元素映射
借助purrr::map2_lgl对每一对cntry和lang做判断:
library(dplyr) library(purrr) individuals <- individuals %>% mutate(natlang = map2_lgl(cntry, lang, ~ .y %in% languages$llang[languages$lcntry == .x]))
验证结果
执行上述任意方案后,individuals$natlang的正确结果为:[1] TRUE FALSE FALSE TRUE TRUE FALSE TRUE
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

