在R中基于每日端口Port_max与Value用指定公式生成数据框新列遇阻
按每日端口计算最大值并生成新列的解决方案
你的核心需求是:按日期+端口分组,用当日该端口的最大Value,结合公式119×((最大值/当前Value)-1)^1.231生成新列。原代码失败是因为Port_max仅在最大值所在行有值,其余行都是NA,且未做分组处理。
解决步骤(用dplyr实现)
- 从
Timestamp中提取日期部分,用于按日分组; - 按「日期+端口」分组,计算每组的最大Value(或直接提取组内非NA的
Port_max); - 用分组后的最大值代入公式,为每一行生成新列。
代码示例一:直接计算每组Value的最大值
library(dplyr) library(lubridate) # 转换Timestamp为日期格式,提取日期列 df <- df %>% mutate(Date = as.Date(Timestamp)) # 分组计算最大值并生成新列x df1 <- df %>% group_by(Date, Port) %>% mutate( # 计算当日当前端口的Value最大值 daily_port_max = max(Value, na.rm = TRUE), # 代入公式计算新列 x = 119 * ((daily_port_max / Value) - 1) ^ 1.231 ) %>% ungroup()
代码示例二:利用现有Port_max列提取最大值
如果原数据中Port_max确实是当日该端口的最大值(仅最大值行非NA),也可以直接提取组内的Port_max最大值:
df1 <- df %>% mutate(Date = as.Date(Timestamp)) %>% group_by(Date, Port) %>% mutate( daily_port_max = max(Port_max, na.rm = TRUE), x = 119 * ((daily_port_max / Value) - 1) ^ 1.231 ) %>% ungroup()
异常处理(可选)
如果某组的Value全为NA,max(..., na.rm = TRUE)会返回-Inf,导致计算出错。可以用ifelse过滤这类情况:
x = ifelse(is.finite(daily_port_max), 119 * ((daily_port_max / Value) - 1) ^ 1.231, NA)
内容的提问来源于stack exchange,提问作者DCB
相关产品推荐
相关产品推荐

