【问题标题】:Error in UseMethod("select") : no applicable method for 'select' applied to an object of class "character"UseMethod("select") 中的错误:没有适用于“选择”的方法应用于“字符”类的对象
【发布时间】:2022-01-06 05:39:11
【问题描述】:

这个问题和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

【问题讨论】:

    标签: r


    【解决方案1】:

    两个问题:

    • return_coef 函数的第一个参数是一个名为 df1data.frame,但您使用 df1$date2(字符串)调用它。我认为你应该从

      开始
      mapply(return_coef, list(df1), df1$date2, df1$Category)
      

      (尽管目前这确实出错,请参阅下一个项目符号)。

      本例中的list(df1) 意味着整个df1 将作为df1$date2df1$Category 中每一对的第一个参数传递。

    • 它现在以argument "var1" is missing, with no default 失败,但我怀疑你正在为此努力。我会随机选择几个名字,然后……会发生一些事情。

    最终,该功能原样正常,只需将您的 mapply 更改为:

    mapply(return_coef, list(df1), df1$date2, df1$Category, var1 = "a1", var2 = "a2")
    # [1] 6.539702 4.000000 1.000000 3.000000
    

    因为var1var2 的长度都是1,所以它们被回收以用于对return_coef 的所有调用(作为它们的命名参数)。

    由于您使用的是dplyr,因此可以比使用cbind(...) 更直接地将其整齐地放入管道中:

    library(dplyr)
      df1 %>%
        transmute(
          date2, Category,
          coef = mapply(return_coef, list(cur_data()), date2, Category, var1 = "a1", var2 = "a2")
        )
    #        date2 Category     coef
    # 1 2021-06-27      ABC 6.539702
    # 2 2021-07-01      ABC 4.000000
    # 3 2021-07-02      ABC 1.000000
    # 4 2021-07-03      ABC 3.000000
    

    我使用transmute 而不是前面的select(date2, Category),因为该函数需要在整个帧中存在变量。我也可以轻松完成mutate(coef=..) %&gt;% select(date2, Category, coef)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2019-04-07
    • 2023-04-06
    • 2019-09-12
    • 2020-04-10
    • 2022-12-15
    相关资源
    最近更新 更多