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

tidyverse转data.table报错:unused argument (by = .(codeGeo, Hopital))

问题分析与修正方案

核心错误原因

报错Error in [.data.frame: unused argument (by = .(codeGeo, Hopital))的直接原因是:ZoneHop1.1()返回的是普通data.frame对象,而非data.table对象。data.table的[, ..., by=]语法仅适用于data.table类型,直接在data.frame上调用会触发该错误。

此外,ChatGPT生成的代码还存在逻辑漏洞:

  • data_tally仅按codeGeo汇总求和,此时数据中已丢失Hopital列,后续data_tally[Hopital == input$Hopital1]会因找不到Hopital列报错。
  • 原tidyverse逻辑中,sejour.com是每个codeGeo的总就诊数,而ChatGPT的代码错误将其赋值给Sej.Hop1,混淆了分组计数与总计数的含义。

修正后的data.table代码

dfMktHop1_Z1 <- reactive({
  # 将reactive返回的data.frame转换为data.table对象
  data <- as.data.table(ZoneHop1.1())
  
  # 按codeGeo和Hopital分组,统计每组就诊数
  data_count <- data[, .(n = .N), by = .(codeGeo, Hopital)]
  
  # 按codeGeo计算总就诊数,直接添加为新列(保留Hopital信息)
  data_count[, sejour.com := sum(n), by = codeGeo]
  
  # 过滤指定医院数据,选择并重命名目标列
  result <- data_count[Hopital == input$Hopital1, 
                       .(codeGeo, Hopital1 = Hopital, Sej.Hop1 = n, sejour.com)]
  
  # 可选:若需将codeGeo改名为Code,取消下方注释
  # setnames(result, "codeGeo", "Code")
  
  return(result)
})

代码说明

  1. 类型转换:通过as.data.table()将输入的data.frame转为data.table,确保后续data.table语法生效。
  2. 分组计数:data[, .(n = .N), by = .(codeGeo, Hopital)]对应原tidyverse的group_by(codeGeo,Hopital)%>%count(),.N是data.table内置的分组行数变量。
  3. 总就诊数计算:data_count[, sejour.com := sum(n), by = codeGeo]对应原tidyverse的group_by(codeGeo)%>%add_tally(n,name="sejour.com"),直接在原计数表上添加总计数列,避免丢失Hopital信息。
  4. 过滤与重命名:按指定医院过滤后,直接选择目标列并完成重命名,逻辑与原tidyverse代码完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:55:35