R语言按日期计算平均价格:dplyr报错及data.table实现咨询
嘿,我来帮你搞定这个按日期计算平均价格的需求!先帮你理清之前代码出错的原因,再给你用data.table实现的完整方案~
先说说你原代码的问题(dplyr部分)
你之前的dplyr代码有几个明显的错误:
group_by(DataFrame$Date):在dplyr的管道语法里,不需要加数据框前缀,直接写group_by(Date)就行,管道已经把数据传递过来了。summarize(DataFrame$price == mean(DataFrame$Price)):这部分完全写错了——你这里是在做一个逻辑判断(判断DataFrame$price是否等于平均值),而且列名还写错了(原数据是大写的Price,你写成了小写price),最后还没给结果列命名,所以才会报“长度不为1”的错误。
正确的dplyr写法应该是:
library(dplyr) DataFrame %>% group_by(Date) %>% summarize(AveragePrice = mean(Price, na.rm = TRUE))
重点:用data.table实现你的需求
接下来是你想要的data.table方案,步骤很清晰:
1. 先准备测试数据(和你给出的一致)
如果还没创建数据框,可以用这段代码生成:
DataFrame <- data.frame( ID = 1:10, Date = as.Date(c("2001-01-02", "2001-01-04", "2001-01-03", "2001-01-03", "2001-01-03", "2001-01-02", "2001-01-02", "2001-01-04", "2001-01-04", "2001-01-02")), RoomAv = c(TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE), Price = c(110, 120, 130, 140, 150, 160, 170, 180, 190, 200) )
2. 加载data.table并转换数据格式
data.table需要先把普通的data.frame转换成它的专属格式,用setDT()函数就行:
library(data.table) setDT(DataFrame)
3. 按日期分组计算平均价格
用data.table的语法一行就能搞定:
result <- DataFrame[, .(AveragePrice = mean(Price, na.rm = TRUE)), by = Date]
4. 查看结果
运行后你会得到完全符合你需求的输出:
Date AveragePrice 1: 2001-01-02 160.0 2: 2001-01-04 163.3333 3: 2001-01-03 140.0
解释一下data.table的语法
by = Date:指定按照Date列进行分组.(AveragePrice = mean(Price, na.rm = TRUE)):创建一个名为AveragePrice的新列,值是每组Price的平均值;na.rm = TRUE是为了处理可能存在的缺失值,避免结果出现NA- 整个语句的逻辑是:对
DataFrame按Date分组,每组计算Price的平均值,最终保留Date和计算出的AveragePrice列
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

