Search code examples
rhistogramdifftime

R Modify the class DIFFTIME to hist


In my script I have transform this data.frame as shown:

df.modified<-transform(df, new.col= Payment.date-Selectionfinal$Invoice.Date)

This is the result:

    Client.Code. Invoice.Date Payment.date  new.col
1:      1004850   2016-01-31   2016-11-22 296 days
2:      1004850   2016-06-30   2016-11-22 145 days
3:      1004850   2016-06-30   2016-11-22 145 days
4:      1004850   2016-06-30   2016-11-22 145 days
5:      1004850   2016-09-30   2016-11-22  53 days

Then, i need to plot it into an histogram, but I have this problem:

> hist(df.modified[,c(4)])
Error in hist.default(Completo[, c(4)]) : 'x' must be numeric

This is the str of my df:

$ Client.Code.: int  1004850 1004850 1004850 1004850 1004850 1004850 1004850 1004874 1004874 1005133 ...
$ Invoice.Date: Date, format: "2016-01-31" "2016-06-30" "2016-06-30" "2016-06-30" ...
$ Payment.date: Date, format: "2016-11-22" "2016-11-22" "2016-11-22" "2016-11-22" ...
$ new.col     :Class 'difftime'  atomic [1:4430] 296 145 145 145 53 53 53 102 72 71 ...

Please i will like to know the trick for that. Thank you.


Solution

  • As Kristofersen already pointed out, the problem is in the type of what you pass as data to hist function. The data is expected to be numeric and does not accept difftime.

    # some data mimicking your data
    Client.Code. <- c(1004850, 1004849, 1004850, 1004850, 1004851)
    Invoice.Date <- as.Date(c("2016-01-31", "2016-03-30", "2016-06-30", "2016-06-30", "2016-04-30"))
    Payment.date <- as.Date(c("2016-11-22", "2016-10-22", "2016-09-22", "2016-08-22", "2016-10-09"))
    # creating the new column in a similar way to your way
    df <- data.frame(Client.Code., Invoice.Date, Payment.date)
    df$new.col <- df$Payment.date - df$Invoice.Date
    
    ## the following 3 do not work because they pass difftime to hist()
    hist(df[,c(4)])
    hist(df[,4])
    hist(df$new.col)
    
    # class of difftime
    class(df$new.col)
    
    ## these 3 do work: numeric is passed to hist()
    hist(as.numeric(df$new.col))
    hist(as.numeric(df[,4]))
    hist(as.numeric(df[,c(4)]))