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

R生成数据集df1所有日期/类别系数的第二段代码运行异常求助

R代码问题修正:批量计算日期/类别组合系数

第二段代码错误原因

  • 未定义变量:直接复用了第一段自定义函数中的dmda、CategoryChosse参数,这两个变量在purrr的遍历逻辑中没有被传入和定义,运行时会直接抛出对象未找到的报错
  • 遍历维度缺失:仅遍历了date2的取值,没有同时遍历每个日期对应的Category,无法实现按「日期+类别」组合计算系数的需求
  • 结果返回错误:最后构造tibble时使用了不存在的model变量提取系数,实际if/else分支已经计算出了目标系数值,直接引用该结果即可
  • 缺失依赖包加载:代码中用到的pivot_longer、ymd、parse_number等函数分别属于tidyr、lubridate、readr包,未加载会导致运行报错

修正后的完整代码

library(purrr)
library(dplyr)
library(tidyr)
library(lubridate)
library(readr)

df1 <- structure(
  list(date1= c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28"),
       date2 = c("2021-06-29","2021-06-29","2021-07-06","2021-07-06","2021-07-06"),
       Category = c("FDE","ABC","FDE","ABC","DDE"),
       Week= c("Tuesday","Tuesday","Tuesday","Tuesday","Tuesday"),
       DR1 = c(4,1,0,2,2),
       DR01 = c(4,1,0,3,2), DR02= c(4,2,0,2,4),DR03= c(9,5,0,7,1),
       DR04 = c(5,4,0,2,1),DR05 = c(5,4,0,4,1),
       DR06 = c(2,4,0,2,4),DR07 = c(2,5,3,4,5),
       DR08 = c(3,4,5,4,4),DR09 = c(2,3,7,4,5),DR10 = c(2,3,9,4,5),DR13 = c(2,3,10,4,5)),
  class = "data.frame", row.names = c(NA, -5L))

# 同时遍历日期和类别两个维度的组合
pmap_dfr(df1 %>% select(date2, Category), ~ {
  # 把传入的两个参数赋值给对应变量
  dmda <- ..1
  CategoryChosse <- ..2
  
  x<-df1 %>% select(starts_with("DR0"))
  
  x<-cbind(df1, setNames(df1$DR1 - x, paste0(names(x), "_PV")))
  PV<-select(x, date2,Week, Category, DR1, ends_with("PV"))
  
  med<-PV %>%
    group_by(Category,Week) %>%
    summarize(across(ends_with("PV"), median), .groups = "drop")
  
  SPV<-df1 %>%
    inner_join(med, by = c('Category', 'Week')) %>%
    mutate(across(matches("^DR0\\d+$"), ~.x + 
                    get(paste0(cur_column(), '_PV')),
                  .names = '{col}_{col}_PV')) %>%
    select(date1:Category, DR01_DR01_PV:last_col())
  
  SPV<-data.frame(SPV)
  
  mat1 <- df1 %>%
    filter(date2 == dmda, Category == CategoryChosse) %>%
    select(starts_with("DR0")) %>%
    pivot_longer(cols = everything()) %>%
    arrange(desc(row_number())) %>%
    mutate(cs = cumsum(value)) %>%
    filter(cs == 0) %>%
    pull(name)
  
  dropnames <- paste0(mat1,"_",mat1, "_PV")
  
  SPV <- SPV %>%
    filter(date2 == dmda, Category == CategoryChosse) %>%
    select(-any_of(dropnames))
  
  datas<-SPV %>%
    filter(date2 == ymd(dmda)) %>%
    group_by(Category) %>%
    summarize(across(starts_with("DR0"), sum), .groups = "drop") %>%
    pivot_longer(cols= -Category, names_pattern = "DR0(.+)", values_to = "val") %>%
    mutate(name = readr::parse_number(name))
  colnames(datas)[-1]<-c("Days","Numbers")
  
  datas <- datas %>% 
    group_by(Category) %>% 
    slice((as.Date(dmda) - min(as.Date(df1$date1) [
      df1$Category == first(Category)])-2):max(Days)+1) %>%
    ungroup
  
  m<-df1 %>%
    group_by(Category,Week) %>%
    summarize(across(starts_with("DR1"), mean), .groups = "drop")
  
  m<-subset(m, Week == df1$Week[match(ymd(dmda), ymd(df1$date2))] & Category == CategoryChosse)$DR1
  
  # 把计算出的系数赋值给res变量
  if (nrow(datas)<=2){
    res <- as.numeric(m)
  } else{
    mod <- nls(Numbers ~ b1*Days^2+b2,start = list(b1 = 0,b2 = 0),data = datas, algorithm = "port")
    res <- as.numeric(coef(mod)[2])
  }
  
  # 直接用res构造结果
  tibble(date2 = dmda, Category = CategoryChosse, coef = res)
  
}) %>%
  mutate(date2 = format(ymd(date2), "%d/%m/%Y")) 

运行结果

修正后代码输出结果和第一段完全一致:

date2Categorycoef
29/06/2021FDE5.3478916
29/06/2021ABC1.3694779
06/07/2021FDE-0.7451236
06/07/2021ABC-0.5182055
06/07/2021DDE2.0000000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:02