[R] writing a function to work with dplyr::mutate()

David Winsemius dw|n@em|u@ @end|ng |rom comc@@t@net
Tue Jan 19 20:02:02 CET 2021


On 1/19/21 7:50 AM, Steven Rigatti wrote:
> I am having some problems with what seems like a pretty simple issue. I
> have some data where I want to convert numbers. Specifically, this is
> cancer data and the size of tumors is encoded using millimeter
> measurements. However, if the actual measurement is not available the
> coding may imply a less specific range of sizes. For instance numbers 0-89
> may indicate size in mm, but 90 indicates "greater than 90 mm" , 91
> indicates "1 to 2 cm", etc. So, I want to translate 91 to 90, 92 to 15, etc.
>
> I have many such tables so I would like to be able to write a function
> which takes as input a threshold over which new values need to be looked
> up, and the new lookup table, returning the new values.
>
> I successfully wrote the function:
>
> translate_seer_numeric <- function(var, upper, lookup) {
>      names(lookup) <- c('old','new')
>      names(var) <- 'old'
>      var <- as.data.frame(var)
>      lookup2 <- data.frame(old = c(1:upper),
>                            new = c(1:upper))
>      lookup3 <- rbind(lookup, lookup2)
>   print(var)
>      res <- left_join(var, lookup3, by = 'old') %>%
>           select(new)
>
>      res
>
> }
>
> test1 <- data.frame(old = c(99,95,93, 8))lup <- data.frame(bif = c(93, 95, 99),


This throws an error when copy-pasted, since you posted in html and 
there was no line separator.


>                    new = c(3, 5, NA))
> translate_seer_numeric(test1, 90, lup)
>
> The above test generates the desired output:
>
>    old1  992  953  934   8
>    new1  NA2   53   34   8
>
> My problem comes when I try to put this in line with pipes and the mutate
> function:
>
> test1 %>%
>       mutate(varb = translate_seer_numeric(var = old, 90, lup))####


#Added:

library(tidyverse)   # since many people on rhelp are not particularly 
"tidy".

>   Error: Problem with `mutate()` input `varb`.
> x Join columns must be present in data.
> x Problem with `old`.
> i Input `varb` is `translate_seer_numeric(var = test1$old, 90, lup)`.


I think I got useful results with this although you might need to 
extract the "new" column from the dataframe result.


test1 %>%    mutate(varb = translate_seer_numeric( . , 90, lup))

#----------

   old
1  99
2  95
3  93
4   8
   old new
1  99  NA
2  95   5
3  93   3
4   8   8

  When you want to refer to the prior result in a piped chain you use a 
dot ("."). I'm guessing you know this. But what I saw was that your 
successful test case was using a dataframe as the input to the first 
parameter of translate_seer_numeric, but you were apparently passing a 
column name when it was being used in a pipe.


The error message wasn't particularly helpful to me, but maybe that's 
because I don't have enough experience in that non-standard universe. It 
did tell us that the there was a problem with "varb" and that was 
probably because that was the wrong parameter name. However even 
changing the call to just `var=old` would probably have failed as well 
because you didn't write the function to accept a variable name as the 
first parameter.

Best;

David.

>
> Thoughts??
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list