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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:12:03