这个问题与这个问题非常相似为所有日期/类别制作系数 https://stackoverflow.com/questions/69520290/make-coefficient-for-all-dates-categories,不同的是return_coef
功能。您将看到我可以生成每一天/类别的系数,但是当我要求立即为每个人生成系数时,我收到以下错误:
Error in UseMethod("select") :
no applicable method for 'select' applied to an object of class "character"
可执行代码如下:
library(dplyr)
library(tidyverse)
library(lubridate)
df1 <- structure(
list(date1= c("2021-06-26","2021-06-26","2021-06-26","2021-06-26"),
date2 = c("2021-06-27","2021-07-01","2021-07-02","2021-07-03"),
Category = c("ABC","ABC","ABC","ABC"),
Week= c("Saturday","Wednesday","Thurday","Saturday"),
DR1 = c(5,4,1,1),
DRM01 = c(8,4,1,0), DRM02= c(7,4,2,0),DRM03= c(6,9,5,0),
DRM04 = c(5,5,4,0),DRM05 = c(5,5,4,0),DRM06 = c(7,5,4,0),DRM07 = c(2,5,4,0),DRM08 = c(2,5,4,0)),
class = "data.frame", row.names = c(NA, -4L))
return_coef <- function(df1, dmda, CategoryChosse, var1, var2, gnum=0, graf=1) {
x<-df1 %>% select(starts_with("DRM0"))
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) %>%
dplyr::summarize(dplyr::across(ends_with("PV"), median))
SPV<-df1%>%
inner_join(med, by = c('Category', 'Week')) %>%
mutate(across(matches("^DRM0\\d+$"), ~.x +
get(paste0(cur_column(), '_PV')),
.names = '{col}_{col}_PV')) %>%
select(date1:Category, DRM01_DRM01_PV:last_col())
SPV<-data.frame(SPV)
mat1 <- df1 %>%
dplyr::filter(date2 == dmda, Category == CategoryChosse) %>%
select(starts_with("DRM0")) %>%
pivot_longer(cols = everything()) %>%
arrange(desc(row_number())) %>%
mutate(cs = cumsum(value)) %>%
dplyr::filter(cs == 0) %>%
pull(name)
(dropnames <- paste0(mat1,"_",mat1, "_PV"))
SPV <- SPV %>%
filter(date2 == dmda, Category == CategoryChosse) %>%
select(-any_of(dropnames))
if(length(grep("DRM0", names(SPV))) == 0) {
SPV[head(mat1,10)] <- NA_real_
}
datas <-SPV %>%
dplyr::filter(date2 == ymd(dmda)) %>%
group_by(Category) %>%
dplyr::summarize(dplyr::across(starts_with("DRM0"), sum)) %>%
pivot_longer(cols= -Category, names_pattern = "DRM0(.+)", values_to = "val") %>%
mutate(name = readr::parse_number(name))
colnames(datas)[-1]<-c(var1,var2)
datas$days <- datas[[as.name(var1)]]
datas$numbers <- datas[[as.name(var2)]]
datas <- datas %>%
group_by(Category) %>%
slice((as.Date(dmda) - min(as.Date(df1$date1) [
df1$Category == first(Category)])):max(days)+1) %>%
ungroup
m<-df1 %>%
group_by(Category,Week) %>%
dplyr::summarize(dplyr::across(starts_with("DR1"), mean))
m<-subset(m, Week == df1$Week[match(ymd(dmda), ymd(df1$date2))] & Category == CategoryChosse)$DR1
if (nrow(datas)<=2){
val<-as.numeric(m)
}
else{
mod <- nls(numbers ~ b1*days^2+b2,start = list(b1 = 0,b2 = 0),data = datas, algorithm = "port")
coef<-coef(mod)[2]
val<-as.numeric(coef(mod)[2])
}
return(val)
}
All<-cbind(df1 %>% select(date2, Category), coef = mapply(return_coef, df1$date2, df1$Category))
Error in UseMethod("select") :
no applicable method for 'select' applied to an object of class "character"
如果我想分别知道每一项的系数,我可以做到。
return_coef(df1, "2021-06-27","ABC", var1=0,var2=1)
[1] 6.539702
return_coef(df1, "2021-07-01","ABC", var1=0,var2=1)
[1] 4
return_coef(df1, "2021-07-02","ABC", var1=0,var2=1)
[1] 1
return_coef(df1, "2021-07-03","ABC", var1=0,var2=1)
[1] 3