[R] replace character by numeric value

Enrico Schumann e@ @end|ng |rom enr|co@chum@nn@net
Thu Sep 28 09:12:53 CEST 2023


On Wed, 27 Sep 2023, arnaud gaboury writes:

> I have two data.frames:
>
> mydf1 <- structure(list(symbol = "ETHUSDT", cummulative_quote_qty =
> 1999.9122, side = "BUY", time = structure(1695656875.805, tzone = "", class
> = c("POSIXct", "POSIXt"))), row.names = c(NA, -1L), class = c("data.table",
> "data.frame"))
>
> mydf2 <- structure(list(symbol = c("ETHUSDT", "ETHUSDT", "ETHUSDT"),
> cummulative_quote_qty = c(1999.119408,
> 0, 2999.890985), side = c("SELL", "BUY", "BUY"), time =
> structure(c(1695712848.487,
> 1695744226.993, 1695744509.082), class = c("POSIXct", "POSIXt"
> ), tzone = "")), row.names = c(NA, -3L), class = c("data.table",
> "data.frame"))
>
> I use this line to replace 'BUY' by numeric 1 and 'SELL' by numeric -1 in
> mydf1 and mydf2:
> mynewdf <- mydf |> dplyr::mutate(side = ifelse(side == 'BUY', 1,
> ifelse(side == 'SELL', -1, side)))
>
> This does the job but I am left with an issue: 1 and -1 are characters for
> mynewdf2 when it is numeric for mynewdf1. The result I am expecting is
> getting numeric values.
> I can't solve this issue (using as.numeric(1) doesn't work) and don't
> understand why I am left with num for mynewdf1 and characters for mynewdf2.
>
>> mynewdf1 <- mydf1 |> dplyr::mutate(side = ifelse(side == 'BUY', 1,
> ifelse(side == 'SELL', -1, side)))
>> str(mynewdf1)
> Classes ‘data.table’ and 'data.frame': 1 obs. of  4 variables:
>  $ symbol               : chr "ETHUSDT"
>  $ cummulative_quote_qty: num 2000
>  $ side                 : num 1      <<<------
>  $ time                 : POSIXct, format: "2023-09-25 17:47:55"
>  - attr(*, ".internal.selfref")=<externalptr>
>
>> mynewdf2 <- mydf2 |> dplyr::mutate(side = ifelse(side == 'BUY', 1,
> ifelse(side == 'SELL', -1, side)))
>>  str(mynewdf2)
> Classes ‘data.table’ and 'data.frame': 3 obs. of  4 variables:
>  $ symbol               : chr  "ETHUSDT" "ETHUSDT" "ETHUSDT"
>  $ cummulative_quote_qty: num  1999 0 3000
>  $ side                 : chr  "-1" "1" "1"   <<<------
>  $ time                 : POSIXct, format: "2023-09-26 09:20:48"
> "2023-09-26 18:03:46" "2023-09-26 18:08:29"
>  - attr(*, ".internal.selfref")=<externalptr>
>
> Thank you for help
>

I'd use something like this:

    map <- c(BUY = 1, SELL = -1)
    mydf1$side <- map[mydf1$side]
    str(mydf1)
    ## Classes ‘data.table’ and 'data.frame':	1 obs. of  4 variables:
    ##  $ symbol               : chr "ETHUSDT"
    ##  $ cummulative_quote_qty: num 2000
    ##  $ side                 : num 1
    
    mydf2$side <- map[mydf2$side]
    str(mydf2)
    ## Classes ‘data.table’ and 'data.frame':	3 obs. of  4 variables:
    ##  $ symbol               : chr  "ETHUSDT" "ETHUSDT" "ETHUSDT"
    ##  $ cummulative_quote_qty: num  1999 0 3000
    ##  $ side                 : num  -1 1 1
    ##  $ time                 : POSIXct, format: "2023-09-26 09:20:48" ...



-- 
Enrico Schumann
Lucerne, Switzerland
http://enricoschumann.net



More information about the R-help mailing list