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

为何手动指定列索引可正常子集化,用变量替代却异常?

问题原因分析

你遇到的异常核心原因是列索引的类型差异导致data.table解析行为变化:

  • 手动写的3是R的**整数型(integer)数值,而通过as.double(which(...))得到的index是浮点型(double)**数值(比如3.0)。
  • 当你组合c(1, index)时,整个向量会被强制转换成浮点型(c(1.0, 3.0))。在data.table的列索引规则中,浮点型数值会被尝试匹配列名(而非列位置)——你的数据集里显然没有名为"1.0"或"3.0"的列,最终只有整数1对应的列被正确识别(因为data.table会自动将整数型索引解析为列位置),导致返回结果仅包含第一列的第一行,也就是你看到的数值1。

验证与修复方法

  1. 验证索引类型:在函数中添加打印语句,确认index的类型和值:
    best_hospital <- function(x, y) {
      statesub <- outcomes3[State == x]
      sorted <- statesub[order(statesub, get(y)), ]
      index <- as.double(which(names(outcomes3) == y))
      print(class(index))  # 会输出"numeric"(即double)
      print(c(1, index))   # 会输出c(1.0, 3.0)
      head(sorted[ ,c(1,index), drop = FALSE],1)
    }
    
  2. 修复方法:将index转换为整数型,保持和手动输入的3类型一致:
    best_hospital <- function(x, y) {
      statesub <- outcomes3[State == x]
      sorted <- statesub[order(get(y), statesub[[1]]), ]  # 修正排序逻辑,按目标列+医院名排序
      index <- as.integer(which(names(outcomes3) == y))  # 转成整数型
      head(sorted[ ,c(1,index), drop = FALSE],1)
    }
    

另外,你原代码中的order(statesub, get(y))排序逻辑有问题——它会先按整个数据集的行向量排序,再按目标列排序,这不是你想要的行为,改成order(get(y), statesub[[1]])可以实现按目标死亡率列升序、医院名称升序排序的预期效果。

内容的提问来源于stack exchange,提问作者BPMData

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:52:02