1

So I understand how the apply function should be used but I am not sure how to integrate with an IF statement. Here is my attempt and can someone please push me in the right direction:

data <- mtcars
    apply(data, 1, function(x) {
      if (data$mpg < 20) {
      data$colour <- "blue"
      } else {
      data$colour <- "red"
      }
    })

I just want to add a column to data for each row of the data frame for values in data$mpg between certain ranges.

2
  • Please add a sample of your expected output. Commented Jul 29, 2019 at 16:29
  • I think you need sapply not apply or apply within a margin of 2, applying on mpg. Commented Jul 29, 2019 at 16:32

2 Answers 2

1

You can do this using vectorization, which is preferred in R due to its speed:

data <- mtcars
data$colour <- ifelse(data$mpg < 20, data$colour <- "blue", data$colour <- "red")

This yields the following data.frame:

            mpg cyl  disp  hp drat    wt  qsec vs am gear carb colour
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    red
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    red
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    red
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    red
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2   blue
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   blue
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4   blue
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2    red
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2    red
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4   blue
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4   blue
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3   blue
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3   blue
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3   blue
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4   blue
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4   blue
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4   blue
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1    red
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    red
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1    red
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1    red
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2   blue
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2   blue
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4   blue
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2   blue
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1    red
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2    red
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2    red
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4   blue
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   blue
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8   blue
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2    red
Sign up to request clarification or add additional context in comments.

Comments

1

A base based option using within:

 head(within(mtcars,{
      my_col <-ifelse(mpg < 20, "blue", "red")
        }),3)
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
              my_col
Mazda RX4        red
Mazda RX4 Wag    red
Datsun 710       red

Or with sapply which in my experience is a bit faster than applying at a margin of 2:

mtcars$colour<-sapply(mtcars[,"mpg"], function(x) ifelse(x<20,"blue","red"))
#rm(mtcars)
#data(mtcars)
#restores mtcars^^

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.