Recode a variable using data.table package

后端 未结 3 1898
名媛妹妹
名媛妹妹 2021-01-27 16:10

If I want to recode a variable in R using data.table, what is the syntax? I saw some ans but didn\'t find them appropriate.

e.g. if I have the variable cal

相关标签:
3条回答
  • 2021-01-27 16:21

    You can do it this way

    library(data.table)
    trips <- data.table(Name=c('John','Tina','Dave','Casper'),gender=c(1,2,1,0))
    trips[,gender:= ifelse(gender == 0 , "Unknown", 
                            ifelse(gender == 1 ,  "Male", 
                                                  "Female" ))]
    

    Two problems in your code:

    • You need to use := which is the assigning symbol for a column in data.table
    • You can only have one alternative with ifelse, so you need another ifelse for the third case: if gender is not 0 then you need to test if gender is 1 to separate the Male and Female cases
    0 讨论(0)
  • 2021-01-27 16:23

    Put the rules in a table and do an update join:

    gmap = data.table(old = 0:2, new = c("Unknown", "Male", "Female"))
    trips[, Gender := gmap[copy(.SD), on=.(old = Gender), x.new]]
    
         Name  Gender
    1:   John    Male
    2:   Tina  Female
    3:   Dave  Female
    4: Casper Unknown
    
    0 讨论(0)
  • 2021-01-27 16:32

    Once you have a data.table then it would be most efficient to use a vectorized translation strategy. The match function provides a method of creating a "selection vector" for a choosing a item from a set of character possibilities:

    library(data.table)
    setDT(trips)  # create a data.table from a dataframe
    
    trips[ , Gender := c("Unknown", "male", "Female")[match(Gender, c(0,1,2))] ]
    #-------------------
    > trips
         Name  Gender
    1:   John    male
    2:   Tina  Female
    3:   Dave  Female
    4: Casper Unknown
    

    For this specific case, a simpler solution could be (ht to @Chinsoon):

    trips[, gender := c("Unknown", "Male", "Female")[gender + 1L] ]
    
    0 讨论(0)
提交回复
热议问题