How to adjust function without specifying dataset

I have a function that basically filters an SPV row, as you can see below. Note that I do return_coef <- function(df1, idd,dmda, CategoryChosse) { However, I would not like df1 as an argument of the function, but rather the attributes of the df1 dataset, which in this case is Id, date1, Week, Category, DR1 and DRM. How can I adjust this?

library(dplyr)
library(tidyr)
library(lubridate)


df1 <- structure(
  list(
    Id = c(1, 1, 1, 1),
    date1 = c("2022-01-06","2022-01-06","2022-01-06","2022-01-06"),
    date2 = c("2022-01-02","2022-01-03","2022-01-09","2022-01-10"),
    Week = c("Sunday","Monday","Sunday","Monday"),
    Category = c("EFG", "ABC","EFG","ABC"),
    DR1 = c(200, 300, 200, 200),
    DRM0 = c(300, 300, 300, 300),
    DRM01 = c(300, 300, 300, 300),
    DRM02 = c(300,300,300,300),
    DRM03 = c(300,300,300,300),
    DRM04 = c(300,250,350,350)),row.names = c(NA, 4L), class = "data.frame")

return_coef <- function(df1, idd,dmda, CategoryChosse) {
  
x<-df1 %>% select(starts_with("DRM0"))

x<-cbind(df1, setNames(df1$DR1 - x, paste0(names(x), "_PV")))
PV<-select(x,Id, date2,Week, Category, DR1, ends_with("PV"))

med<-PV %>%
  group_by(Id,Category,Week) %>%
  dplyr::summarize(dplyr::across(ends_with("PV"), median))

SPV<-df1%>%
  inner_join(med, by = c('Id','Category', 'Week')) %>%
  mutate(across(matches("^DRM0\\d+$"), ~.x + 
                  get(paste0(cur_column(), '_PV')),
                .names = '{col}_{col}_PV')) %>%
  select(Id:Category, DRM01_DRM01_PV:last_col())

SPV <- SPV %>%
  filter(Id==idd,date2 == dmda, Category == CategoryChosse) 

return(SPV)

}

return_coef(df1, "1", "2022-01-10", "ABC")

`summarise()` has grouped output by 'Id', 'Category'. You can override using the `.groups` argument.
  Id      date1      date2   Week Category DRM01_DRM01_PV DRM02_DRM02_PV DRM03_DRM03_PV DRM04_DRM04_PV
1  1 2022-01-06 2022-01-10 Monday      ABC            250            250            250            300

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.