Base R split()触发unique()仅适用于向量错误的排查与解决咨询
问题解答
1. 报错根源
- 核心原因是环境版本差异:你本地的
dplyr/tidyverse组件版本与segregation包开发者的运行环境不一致。split(~GEOID)这种公式式拆分语法在部分版本的tidyverse环境中,拆分得到的每个子数据集会残留tidyverse特有的分组元数据,导致entropy()函数内部调用unique()处理分组列时,无法将其识别为普通向量,触发unique() applies only to vectors报错。 - 开发者环境能正常运行是因为其使用的tidyverse版本要么兼容这种公式拆分的输出格式,要么默认拆分结果不带残留元数据。
2. 修复方案
方案1(更推荐,性能更好写法更简洁)
直接使用dplyr的分组聚合逻辑替代split+map,完全避开拆分逻辑可能带来的属性问题:
inglewood_entropy <- ca_city_data %>% filter(urban_name == "Inglewood") %>% group_by(GEOID) %>% summarize( entropy = entropy( data = cur_data(), group = "variable", weight = "estimate", base = 4 ), .groups = "drop" )
方案2(兼容原有写法逻辑)
将split的公式写法替换为base R原生的列提取拆分逻辑,同时将子数据集转为普通data.frame消除属性影响:
inglewood_entropy <- ca_city_data %>% filter(urban_name == "Inglewood") %>% split(.$GEOID) %>% # 替换原有的~GEOID公式写法 map_dbl(~{ entropy( data = as.data.frame(.x), # 转为普通data.frame消除tibble属性影响 group = "variable", weight = "estimate", base = 4 ) }) %>% as_tibble(rownames = "GEOID") %>% rename(entropy = value)
两种方案都可以得到你预期的两列tibble结果。
内容的提问来源于stack exchange,提问作者bcongelio
相关产品推荐
相关产品推荐

