Ошибка NSE dplyr::left_join из-за несовместимых типов

Я пишу функцию, которая помогает мне очищать данные полевых испытаний. Я пишу его, используя tidyeval NSE, чтобы испытать себя и убедиться, что функция проста в использовании, если я вернусь к ней. Я думаю, что у меня почти получилось, но при запуске моего тестового кадра я получаю сообщение об ошибке со следующим сообщением:

Ошибка: невозможно присоединиться к 'plantid' x 'year' из-за несовместимых типов (фактор/целое) Вызывается из: left_join_impl(x, y, by_x, by_y, aux_x, aux_y, na_matches, environment())

Сначала было высказано предположение, что это может быть связано с группировкой, поэтому я добавил ungroup() перед соединениями, однако проблема осталась.

Есть ли способ исправить это, не меняя вручную год на символ (?) Заранее большое спасибо.

Функция

id_injured <- function(df, plantid, year, injuries, forbidden_values, monotonic_increase=FALSE,height){
  #Converting variables in selectlist to character
  df <- df %>% mutate_at(injuries,as.character)

  #Parsing unquoted strings.

  plantid <- enquo(plantid)
  year <- enquo(year)
  height <- enquo(height)

  #Mark injured as 1.
  Dataplantid  <- df %>% mutate(is_injured = purrr::pmap_int(select(.,!!injuries), ~any(c(...) %in% !!forbidden_values)))

  #Find time of first observed injury.
  injuredlist <- Dataplantid %>% group_by(!!plantid) %>%  filter(is_injured == 1)  %>% summarise(firstinjury = min(!!year))  %>% ungroup()


  #In plantid group, all years older than first injury are marked 1, else 0.
  joinedinjured <- dplyr::left_join(x=Dataplantid, y=injuredlist, by = rlang::as_name(plantid))

  joinedinjured <- joinedinjured %>% group_by(!!plantid) %>% mutate(afterfirstinjury = case_when(!!year >= firstinjury ~ 1,
                                                                                                                     !!year< firstinjury ~ 0))

  returnvalues <- joinedinjured %>% select(!!plantid, !!year, firstinjury, afterfirstinjury) %>% ungroup()


  ##c() does not support rlang bangs (!!) but takes a string. Solution follows below approach
  # from Lionel Henry, Stackoverflow: https://stackoverflow.com/a/58518138/11550980 


  returnvalues <- left_join(df, returnvalues, by=c(setNames(rlang::as_name(plantid),rlang::as_name(year))))

#Mark all prior to a break in monotonic growth as true.
 if(monotonic_increase==TRUE){

    returnvalues<- returnvalues %>% group_by(!!plantid) %>% arrange(!!plantid, !!year) %>%
      tidyr::fill(!!height, .direction="downup") %>%
      mutate(monotonic_growth = cumall(c(TRUE, diff(height) > 0))) %>% ungroup()
  returnvalues
 }
  returnvalues
}

Тестовый кадр

 plantid <- rep(c("A1","B2","C3","D4","E5"), times=c(3,3,3,3,3))
 year <- rep(1:3, length.out=length(plantid))
 set.seed(42)
 PrimaryInjury <- sample(c(NA,NA,NA,"Rust","Insect","Snow break"), 15, replace=TRUE)
 SecondaryInjury <- rep(NA, length.out=length(plantid))
 OtherInjury <- rep(NA, length.out=length(plantid))
 height <- c(1,2,3,1,2,3,3,2,1,1,2,3,1,3,2)


 testframe <- data.frame(plantid,year,PrimaryInjury,SecondaryInjury, OtherInjury,height)

 rm(OtherInjury)
 rm(plantid)
 rm(PrimaryInjury)
 rm(SecondaryInjury)
 rm(year)
 rm(height)

Выполняется функция — возникает ошибка.

 id_injured(df=testframe, plantid=plantid,year=year,injuries = c("PrimaryInjury","SecondaryInjury","OtherInjury"),forbidden_values = c("Rust","Insect","Snow break"),monotonic_increase = FALSE)

person Silviculturalist    schedule 27.03.2020    source источник
comment
Как ты вообще присоединяешься к plantid и year? У них нет ничего общего, они ни с чем не совпадут.   -  person Ronak Shah    schedule 28.03.2020
comment
@RonakShah, вы говорите, что c (plantid, year) интерпретируется как plantid == year? Я пытаюсь показать, что каждое наблюдение уникально идентифицируется комбинацией плантида и года, поэтому я хочу присоединиться к плантиду и году.   -  person Silviculturalist    schedule 30.03.2020
comment
Затем вы должны удалить setNames(), иначе он попытается сопоставить plantid с year, что приведет к ошибке.   -  person tspano    schedule 02.04.2020
comment
Спасибо @tspano, моя функция теперь работает! Добавьте это как комментарий, и я отмечу это как решенное!   -  person Silviculturalist    schedule 03.04.2020