SSCC - Social Science Computing Cooperative Supporting Statistical Analysis for Research

3.6 Creating/changing variables

The mutate() function is used to modify a variable or recreate a new variable. Variable are changed by using the name of variable as a parameter and the parameter value is set to the new variable. The data frame is typically piped in and the data frame name is not needed when referencing the variable names. A new variable is create when a parameter name is used that is not an existing variable of the data frame.

The examples in this section also demonstrate a number of useful functions to create and inspect variables.


  1. Creating a new variable.

    This example uses a simple mathematical formula to create a new variable based on the value of two other variables.

    forbes <-
      forbes %>%
        pe = market_value / profits
    forbes %>%
      pull(pe) %>%
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    -377.00   11.67   18.50     Inf   28.66     Inf       5 

    The pull() function returns a vector from a data frame. The base R summary() function calculates the five number summary of a numerical vector.

  2. Conditionally changing the values of a variable.

    This example demonstrates two functions that can be used to change the values of variable based on the condition of the variable (or possibly another variable.)

    The following code checks to see if profits is a (strictly) positive number. It it is it calculates the price to earnings ratio. Otherwise it set the price to earning ratio to zero.

    The if_else() function takes three parameters. The first is the condition. When the row of the condition is TRUE, the true value will be used, the second parameter. Otherwise the false value will be used, the third parameter. The true and false parameters can be either a column or a scalar value.

    forbes <-
      forbes %>%
        pe = if_else(profits > 0, market_value / profits, 0)
    forbes %>%
      pull(pe) %>%
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
       0.00   11.53   18.28   26.08   28.42  758.00       5 

    The folowing code uses the recode() function to change values of United States to USA. The recode() function does a test of equality to the parameter name. If the valus of the variable equals the parameter name value, this value is replace with the parameter value.

    United States valid variable and parameter name, since it contains a space. To get R to accept United States as a parameter name it is enclosed in backticks, ```.

    forbes <-
      forbes %>%
        country_abrv = recode(country, `United States` = "USA")
    forbes %>%
      pull(`United States`) %>%
  3. Creating indicator variables.

    The %in% operator is used to determine if the set of values on the left is in the set of values on the right. It returns a boolean, TRUE or FALSE.

    In this example the %in% operator is used to determine if each of the countries is one of the NAFTA countries.

    forbes <-
      forbes %>%
        nafta = country %in% c("United States", "Canada", "Mexico")
    forbes %>%
      pull(nafta) %>%
       Mode   FALSE    TRUE 
    logical    1176     824 

    The base R summary() function counts the number of TRUE and FALSE values in the variable.

  4. Creating a factor variable.

    Factor variables are used to represent categorical variables, a variable that takes on a fixed set of values. Indictor variable are a special case of factor variable, having two values, TRUE and FALSE.

    The following code uses the base R factor() function to change the country variable from character to a factor variable.

    forbes <-
      forbes %>%
        country = factor(country)
    forbes %>%
      pull(country) %>%
                          Africa                    Australia 
                               2                           37 
       Australia/ United Kingdom                      Austria 
                               2                            8 
                         Bahamas                      Belgium 
                               1                            9 
                         Bermuda                       Brazil 
                              20                           15 
                          Canada               Cayman Islands 
                              56                            5 
                           Chile                        China 
                               4                           25 
                  Czech Republic                      Denmark 
                               2                           10 
                         Finland                       France 
                              11                           63 
          France/ United Kingdom                      Germany 
                               1                           65 
                          Greece              Hong Kong/China 
                              12                           20 
                         Hungary                        India 
                               2                           27 
                       Indonesia                      Ireland 
                               7                            8 
                         Islands                       Israel 
                               1                            8 
                           Italy                        Japan 
                              41                          316 
                          Jordan                   Kong/China 
                               1                            4 
                           Korea                      Liberia 
                               4                            1 
                      Luxembourg                     Malaysia 
                               2                           16 
                          Mexico                  Netherlands 
                              17                           28 
     Netherlands/ United Kingdom                  New Zealand 
                               2                            1 
                          Norway                     Pakistan 
                               8                            1 
          Panama/ United Kingdom                         Peru 
                               1                            1 
                     Philippines                       Poland 
                               2                            1 
                        Portugal                       Russia 
                               7                           12 
                       Singapore                 South Africa 
                              16                           15 
                     South Korea                        Spain 
                              45                           29 
                          Sweden                  Switzerland 
                              26                           34 
                          Taiwan                     Thailand 
                              35                            9 
                          Turkey               United Kingdom 
                              12                          137 
       United Kingdom/ Australia  United Kingdom/ Netherlands 
                               1                            1 
    United Kingdom/ South Africa                United States 
                               1                          751 

    The base R summary() function counts the number of occurances of each level for factor variables.

    The following code uses the base R cut() function to convert a numeric variable to factor variable. You define a set bins to sort the values into. This is done using the break parameter. These breaks form the upper and lower limits of each bin. The names given to each of these bins is set by the labels parameter.

    The following code uses cut() to divide profits into low, mid, high, and very high bins.

    forbes <-
      forbes %>%
        profit_lev = cut(profits, 
                       breaks = c(-Inf, .08, .44, 10, Inf),
                       labels = c("low", "mid", "high", "very high")
    forbes %>%
      pull(profit_lev) %>%
          low       mid      high very high      NA's 
          501       999       489         6         5 
  5. Combining categories

    Categories of string variables can be combined using recode() and if_else(). This can result in a fair amount of repitition in code when there are a number of values that need to be grouped. This example used case_when() to recode the categories of the category variable into four new categories. The conditions are checked in order. The TRUE condition serves as the else condition. It is what will be done if none of the prior conditions are TRUE.

    forbes <-
      forbes %>%
        industry = 
            category %in% c("Banking", "Insurance", "Diversified financials") ~
            category == "Oil & gas operations" ~
            category %in% c("Technology hardware & equipment", "Semiconductors",
                            "Drugs & biotechnology", "Software & services") ~
            TRUE ~
    forbes %>%
      select(name, category, industry) %>%
    # A tibble: 6 x 3
      name                category             industry
      <chr>               <chr>                <chr>   
    1 Citigroup           Banking              finance 
    2 General Electric    Conglomerates        other   
    3 American Intl Group Insurance            finance 
    4 ExxonMobil          Oil & gas operations oil_gas 
    5 BP                  Oil & gas operations oil_gas 
    6 Bank of America     Banking              finance