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) })
代码说明
- 类型转换:通过
as.data.table()将输入的data.frame转为data.table,确保后续data.table语法生效。 - 分组计数:
data[, .(n = .N), by = .(codeGeo, Hopital)]对应原tidyverse的group_by(codeGeo,Hopital)%>%count(),.N是data.table内置的分组行数变量。 - 总就诊数计算:
data_count[, sejour.com := sum(n), by = codeGeo]对应原tidyverse的group_by(codeGeo)%>%add_tally(n,name="sejour.com"),直接在原计数表上添加总计数列,避免丢失Hopital信息。 - 过滤与重命名:按指定医院过滤后,直接选择目标列并完成重命名,逻辑与原tidyverse代码完全一致。
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

