Search code examples
rtidyversestringrmicrosoft-r

Tidyverse: If_else + str_length + str_pad to mutate 1 column


I have found quite a few threads on each part of the code snippet I am trying to create/use.. but not in the way(s) I am trying to do it.

I have a dataframe of customer information.

1 column is a customer ID (CID), the 2nd column is the customer specific identifier (CSI)

That means customer a single customer id can represent many specific customers from a bigger pool, and the CSI tells me which specific customer from that pool I am looking at.

Data would look like this:

data.frame("CID"=c("1","2","3","4","1","2","3","4"),
           "Customer_Pool"=c("Art_Supplies", "Automotive_Supplies", "Office_Supplies", "School_Supplies",
                             "Art_Supplies", "Automotive_Supplies", "Office_Supplies", "School_Supplies"),
           "CSI"=c("01","01","01","01","02","02","02","02"),
           "Customer_name"=c("Janet","Jane", "Jill", "Jenna", "Joe", "Jim", "Jack", "Jimmy"))

I am trying to combine the CID and CSI numbers.. the problem is I need all the CID to be double digit (01 instead of 1 for example) to match the CID from 10-99

Here is what I have been trying:

DF <- DF %>% mutate(CID = if_else(str_length(CID = 1),
                                 str_pad(CID, width = 2, side = "left), CID))

The error I am getting says: error in str_length(CID = 1): unused argument (CID = 1)

How would I correct this?


Solution

  • You have some syntax issues here. Try

    DF <- DF %>% mutate(CID = if_else(str_length(CID) == 1,
                                      str_pad(CID, width = 2, side = "left", pad="0"), CID))
    

    When you call str_length(CID = 1), it looks like you are passing a parameter named "CID" to str_length which it knows nothing about. Rather, you wan to take the string length of CID and then compare that to 1 with == to test for equality (not = which is for parameter names and assignments).

    But really the if_else isn't necessary here. If everyhing has to be 2 digits, then just do

    DF <- DF %>% mutate(CID = str_pad(CID, width = 2, side = "left", pad="0"))
    

    str_pad will only pad when needed.