为何手动指定列索引可正常子集化,用变量替代却异常?
问题原因分析
你遇到的异常核心原因是列索引的类型差异导致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。
验证与修复方法
- 验证索引类型:在函数中添加打印语句,确认
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) } - 修复方法:将
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
相关产品推荐
相关产品推荐

