求助:R语言中data.table分组求和的函数式调用写法
解决方法
首先,你遇到的could not find function "[.data.table"错误,大概率是因为没有加载data.table包,或者参数传递的方式不对。下面给你两种靠谱的解决思路,优先推荐第一种,可读性和实用性更强:
方法1:用匿名函数包裹常规data.table语法(最推荐)
在lapply里直接写匿名函数,把你平时用的data.table操作放进去就行,这种写法直观不容易出错,团队协作也更容易理解:
# 假设你的data.table列表叫dt_list library(data.table) result <- lapply(dt_list, function(dt) { dt[, sum(customer_num), by = mall_name] })
方法2:正确调用[.data.table函数
如果一定要用函数式的方式调用[.data.table,需要注意两个关键点:
- 必须先加载data.table包(
library(data.table)),否则R找不到这个S3方法; - 要正确匹配函数参数:
[.data.table的第二个参数是行筛选条件i,如果不需要筛选行,要么传NULL,要么留空(位置参数匹配时留空也可以,但传NULL更清晰)。
正确的写法如下:
library(data.table) # 单个DT的调用 `[.data.table`(DT, i = NULL, j = sum(customer_num), by = mall_name) # 放到lapply里处理列表 result <- lapply(dt_list, function(dt) { `[.data.table`(dt, , sum(customer_num), by = mall_name) })
为什么你的写法会报错?
你之前的代码[.data.table(DT,,sum(customer_num),by = mall_name),如果没加载data.table包,R肯定找不到这个函数;就算加载了包,有时候参数位置的隐式匹配可能出问题,所以不如匿名函数的方式稳妥。
举个完整的示例验证:
# 创建测试数据 DT1 <- data.table(mall_name = c("Mall1", "Mall1", "Mall2"), customer_num = c(50, 30, 45)) DT2 <- data.table(mall_name = c("Mall2", "Mall3", "Mall3"), customer_num = c(20, 15, 25)) dt_list <- list(DT1, DT2) # 用方法1运行 lapply(dt_list, function(dt) dt[, sum(customer_num), by = mall_name])
运行后会得到每个data.table按mall_name分组的customer_num求和结果。
内容的提问来源于stack exchange,提问作者cloudscomputes
相关产品推荐
相关产品推荐

