101 R data.table Exercises

The data.table package in R is super fast when it comes to handling data. It has a syntax that reduces keystrokes while making R code easier to read. These set of exercises are designed to help you to oil your data brain through solving data manipulation exercises. Related post: 101 Python datatable Exercises (pydatatable)

https://machinelearningplus.com/data-manipulation/101-python-datatable-exercises-pydatatable/ 101 R data.table Exercises. Photo by Ela Abbau.101 R data.table Exercises. Photo by Ela Abbau.

1. How to install data.table and check the version?

# Install the data.table package
install.packages("data.table")

# Load the library
library(data.table)

# Check version
print(packageVersion("data.table"))

2. How to create a data.table from lists (vectors) ?

Difficulty Level: L1 Question : Create a pandas series from each of the items below: a list, numpy and a dictionary Input

list_1 <- c("a","b","c","d")
list_2 <- c("1","2","3","4")
list_3 <- c("aa","bb","cc","dd")
Show Solution
# Inputs
list_1 <- c("a","b","c","d")
list_2 <- c("1","2","3","4")
list_3 <- c("aa","bb","cc","dd")

# Solution
DT <- data.table(V1= list_1, V2 =list_2, V3 = list_3 )
print(DT)
#>    V1 V2 V3
#> 1:  a  1 aa
#> 2:  b  2 bb
#> 3:  c  3 cc
#> 4:  d  4 dd

3. How to import csv data files as data.table ?

Difficulty Level: L1 Question : Import BostonHousing dataset as a data.table.

Show Solution
# Solution
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv')
print(head(DT))
#>       crim zn indus chas   nox    rm  age    dis rad tax ptratio      b lstat
#> 1: 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
#> 2: 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
#> 3: 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
#> 4: 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
#> 5: 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
#> 6: 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21
#>    medv
#> 1: 24.0
#> 2: 21.6
#> 3: 34.7
#> 4: 33.4
#> 5: 36.2
#> 6: 28.7

4. How to import only ‘n’ rows from a csv file to create a data.table?

Difficiulty Level: L1 Question : Import first 50 row of BostonHousing dataset as a data.table.

Show Solution
# Solution
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv', nrows = 50)
print(head(DT))
#>       crim zn indus chas   nox    rm  age    dis rad tax ptratio      b lstat
#> 1: 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
#> 2: 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
#> 3: 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
#> 4: 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
#> 5: 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
#> 6: 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21
#>    medv
#> 1: 24.0
#> 2: 21.6
#> 3: 34.7
#> 4: 33.4
#> 5: 36.2
#> 6: 28.7

5. How to import only specified columns from a csv file?

Difficulty Level: L1 Question : Import only ‘crim’ and ‘medv’ columns of the BostonHousing dataset as a data.table.

Show Solution
# Solution
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv', select = c('crim', 'medv'))
print(head(DT))
#>       crim medv
#> 1: 0.00632 24.0
#> 2: 0.02731 21.6
#> 3: 0.02729 34.7
#> 4: 0.03237 33.4
#> 5: 0.06905 36.2
#> 6: 0.02985 28.7

6. How to get the nrows, ncolumns, datatype, summary stats of each column in a data.table

Difficulty Level: L2 Question : Get the number of rows, columns, datatype and summary statistics of each column of the Cars93 dataset. Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv')
Show Solution
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv')

#  number of rows and columns
print(NROW(DT))
print(NCOL(DT))

# datatypes
print(sapply(DT,class))

# summary statistics
summary(DT)
#> [1] 506
#> [1] 14
#>      crim        zn     indus      chas       nox        rm       age       dis
#> "numeric" "numeric" "numeric" "integer" "numeric" "numeric" "numeric" "numeric"
#>       rad       tax   ptratio         b     lstat      medv
#> "integer" "integer" "numeric" "numeric" "numeric" "numeric"
#>
#>
#>
#>       crim                zn             indus            chas
#>  Min.   : 0.00632   Min.   :  0.00   Min.   : 0.46   Min.   :0.00000
#>  1st Qu.: 0.08204   1st Qu.:  0.00   1st Qu.: 5.19   1st Qu.:0.00000
#>  Median : 0.25651   Median :  0.00   Median : 9.69   Median :0.00000
#>  Mean   : 3.61352   Mean   : 11.36   Mean   :11.14   Mean   :0.06917
#>  3rd Qu.: 3.67708   3rd Qu.: 12.50   3rd Qu.:18.10   3rd Qu.:0.00000
#>  Max.   :88.97620   Max.   :100.00   Max.   :27.74   Max.   :1.00000
#>       nox               rm             age              dis
#>  Min.   :0.3850   Min.   :3.561   Min.   :  2.90   Min.   : 1.130
#>  1st Qu.:0.4490   1st Qu.:5.886   1st Qu.: 45.02   1st Qu.: 2.100
#>  Median :0.5380   Median :6.208   Median : 77.50   Median : 3.207
#>  Mean   :0.5547   Mean   :6.285   Mean   : 68.57   Mean   : 3.795
#>  3rd Qu.:0.6240   3rd Qu.:6.623   3rd Qu.: 94.08   3rd Qu.: 5.188
#>  Max.   :0.8710   Max.   :8.780   Max.   :100.00   Max.   :12.127
#>       rad              tax           ptratio            b
#>  Min.   : 1.000   Min.   :187.0   Min.   :12.60   Min.   :  0.32
#>  1st Qu.: 4.000   1st Qu.:279.0   1st Qu.:17.40   1st Qu.:375.38
#>  Median : 5.000   Median :330.0   Median :19.05   Median :391.44
#>  Mean   : 9.549   Mean   :408.2   Mean   :18.46   Mean   :356.67
#>  3rd Qu.:24.000   3rd Qu.:666.0   3rd Qu.:20.20   3rd Qu.:396.23
#>  Max.   :24.000   Max.   :711.0   Max.   :22.00   Max.   :396.90
#>      lstat            medv
#>  Min.   : 1.73   Min.   : 5.00
#>  1st Qu.: 6.95   1st Qu.:17.02
#>  Median :11.36   Median :21.20
#>  Mean   :12.65   Mean   :22.53
#>  3rd Qu.:16.95   3rd Qu.:25.00
#>  Max.   :37.97   Max.   :50.00

7. How to extract the row and column number of a particular cell with given criterion?

Difficulty Level: L2 Question : Which manufacturer, model and type has the highest Price? What is the row and column number of the cell with the highest Price value? Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
# Get Manufacturer with highest price
print(DT[Price == max(Price, na.rm = TRUE)][,list(Manufacturer, Model, Type)])

# Get row number
DT[, .(rownum=.I, Price)][Price == max(Price, na.rm = TRUE), rownum]
#>     Manufacturer Model    Type
#> 1: Mercedes-Benz  300E Midsize

59

8. How to rename a specific columns in a data.table?

Difficulty Level: Easy Question : Rename the column Model as New_Model in DT. Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

print(head(setnames(DT, old = "Model", new = "New_Model")[]))
#>    Manufacturer New_Model    Type Min.Price Price Max.Price MPG.city
#> 1:        Acura   Integra   Small      12.9  15.9      18.8       25
#> 2:         <NA>    Legend Midsize      29.2  33.9      38.7       18
#> 3:         Audi        90 Compact      25.9  29.1      32.3       20
#> 4:         Audi       100 Midsize        NA  37.7      44.6       19
#> 5:          BMW      535i Midsize        NA  30.0        NA       22
#> 6:        Buick   Century Midsize      14.2  15.7      17.3       22
#>    MPG.highway            AirBags DriveTrain Cylinders EngineSize Horsepower
#> 1:          31               None      Front         4        1.8        140
#> 2:          25 Driver & Passenger      Front         6        3.2        200
#> 3:          26        Driver only      Front         6        2.8        172
#> 4:          26 Driver & Passenger       <NA>         6         NA        172
#> 5:          30               <NA>       Rear         4        3.5        208
#> 6:          31        Driver only       <NA>         4        2.2        110
#>     RPM Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length
#> 1: 6300         2890             Yes               13.2          5    177
#> 2: 5500         2335             Yes               18.0          5    195
#> 3: 5500         2280             Yes               16.9          5    180
#> 4: 5500         2535            <NA>               21.1          6    193
#> 5: 5700         2545             Yes               21.1          4    186
#> 6: 5200         2565              No               16.4          6    189
#>    Wheelbase Width Turn.circle Rear.seat.room Luggage.room Weight  Origin
#> 1:       102    68          37           26.5           NA   2705 non-USA
#> 2:       115    71          38           30.0           15   3560 non-USA
#> 3:       102    67          37           28.0           14   3375 non-USA
#> 4:       106    NA          37           31.0           17   3405 non-USA
#> 5:       109    69          39           27.0           13   3640 non-USA
#> 6:       105    69          41           28.0           16     NA     USA
#>             Make
#> 1: Acura Integra
#> 2:  Acura Legend
#> 3:       Audi 90
#> 4:      Audi 100
#> 5:      BMW 535i
#> 6: Buick Century

9. How to check if a data.table has any missing values?

Difficulty Level: L1 Question : Check if DT has any missing values. Return TRUE is present else FALSE. Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
anyNA(DT)

TRUE

10. How to check for missing values in a data.table?

Difficulty Level: L1 Question : Get the location of missing values in DT. Replace the value with TRUE is missing else FALSE. Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

     Manufacturer Model  Type Min.Price Price Max.Price MPG.city MPG.highway
[1,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
[2,]         TRUE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
[3,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
[4,]        FALSE FALSE FALSE      TRUE FALSE     FALSE    FALSE       FALSE
[5,]        FALSE FALSE FALSE      TRUE FALSE      TRUE    FALSE       FALSE
[6,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
(...truncated...)
Show Solution
# Input
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
print(head(is.na(DT)))
#>      Manufacturer Model  Type Min.Price Price Max.Price MPG.city MPG.highway
#> [1,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
#> [2,]         TRUE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
#> [3,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
#> [4,]        FALSE FALSE FALSE      TRUE FALSE     FALSE    FALSE       FALSE
#> [5,]        FALSE FALSE FALSE      TRUE FALSE      TRUE    FALSE       FALSE
#> [6,]        FALSE FALSE FALSE     FALSE FALSE     FALSE    FALSE       FALSE
#>      AirBags DriveTrain Cylinders EngineSize Horsepower   RPM Rev.per.mile
#> [1,]   FALSE      FALSE     FALSE      FALSE      FALSE FALSE        FALSE
#> [2,]   FALSE      FALSE     FALSE      FALSE      FALSE FALSE        FALSE
#> [3,]   FALSE      FALSE     FALSE      FALSE      FALSE FALSE        FALSE
#> [4,]   FALSE       TRUE     FALSE       TRUE      FALSE FALSE        FALSE
#> [5,]    TRUE      FALSE     FALSE      FALSE      FALSE FALSE        FALSE
#> [6,]   FALSE       TRUE     FALSE      FALSE      FALSE FALSE        FALSE
#>      Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase Width
#> [1,]           FALSE              FALSE      FALSE  FALSE     FALSE FALSE
#> [2,]           FALSE              FALSE      FALSE  FALSE     FALSE FALSE
#> [3,]           FALSE              FALSE      FALSE  FALSE     FALSE FALSE
#> [4,]            TRUE              FALSE      FALSE  FALSE     FALSE  TRUE
#> [5,]           FALSE              FALSE      FALSE  FALSE     FALSE FALSE
#> [6,]           FALSE              FALSE      FALSE  FALSE     FALSE FALSE
#>      Turn.circle Rear.seat.room Luggage.room Weight Origin  Make
#> [1,]       FALSE          FALSE         TRUE  FALSE  FALSE FALSE
#> [2,]       FALSE          FALSE        FALSE  FALSE  FALSE FALSE
#> [3,]       FALSE          FALSE        FALSE  FALSE  FALSE FALSE
#> [4,]       FALSE          FALSE        FALSE  FALSE  FALSE FALSE
#> [5,]       FALSE          FALSE        FALSE  FALSE  FALSE FALSE
#> [6,]       FALSE          FALSE        FALSE   TRUE  FALSE FALSE

11. How to get the row and column positions of missing values in a data.table?

Difficulty Level: L2 Question: Get the row and column positions of missing values in DT. Input

DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

[1] "(1, 24)"  "(2, 1)"   "(4, 4)"   "(4, 10)"  "(4, 12)"  "(4, 16)"  "(4, 21)"
[8] "(5, 4)"   "(5, 6)"   "(5, 9)"   "(6, 10)"  "(6, 25)"  "(7, 6)"   "(7, 15)"
[15] "(7, 17)"  "(9, 21)"  "(10, 15)" "(11, 24)" "(12, 9)"  "(12, 10)" "(12, 13)"
[22] "(13, 11)" "(13, 24)" "(14, 11)" "(14, 17)" "(15, 7)"  "(15, 13)" "(15, 19)"
[29] "(15, 22)" "(16, 24)" "(17, 13)" "(17, 24)" "(19, 23)" "(19, 24)" "(19, 26)"
[36] "(20, 1)"  "(20, 22)" "(23, 17)" "(23, 23)" "(24, 15)" "(24, 24)" .. (truncated)
Show Solution
# Input
DT <- fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
output <- c()  # init output vector

for(i in 1:NROW(DT)){
  for(j in 1:NCOL(DT)){
    curr_value <- DT[i, j,with=F][[1]]
    if(is.na(curr_value)){
      position <- paste0('(', paste(i, j, sep=', '), ')')
      output   <- c(output, position)
    }
  }
}

11. How to count the number of missing values in each column of data.table?

Difficulty Level: L2 Question : Count the number of missing values in each column of DT Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
for (i in colnames(DT)){
    print(paste("Number of missing values in column", i , "is", sum(is.na(DT[,..i]))))
}
#> [1] "Number of missing values in column Manufacturer is 4"
#> [1] "Number of missing values in column Model is 1"
#> [1] "Number of missing values in column Type is 3"
#> [1] "Number of missing values in column Min.Price is 7"
#> [1] "Number of missing values in column Price is 2"
#> [1] "Number of missing values in column Max.Price is 5"
#> [1] "Number of missing values in column MPG.city is 9"
#> [1] "Number of missing values in column MPG.highway is 2"
#> [1] "Number of missing values in column AirBags is 6"
#> [1] "Number of missing values in column DriveTrain is 7"
#> [1] "Number of missing values in column Cylinders is 5"
#> [1] "Number of missing values in column EngineSize is 2"
#> [1] "Number of missing values in column Horsepower is 7"
#> [1] "Number of missing values in column RPM is 3"
#> [1] "Number of missing values in column Rev.per.mile is 6"
#> [1] "Number of missing values in column Man.trans.avail is 5"
#> [1] "Number of missing values in column Fuel.tank.capacity is 8"
#> [1] "Number of missing values in column Passengers is 2"
#> [1] "Number of missing values in column Length is 4"
#> [1] "Number of missing values in column Wheelbase is 1"
#> [1] "Number of missing values in column Width is 6"
#> [1] "Number of missing values in column Turn.circle is 5"
#> [1] "Number of missing values in column Rear.seat.room is 4"
#> [1] "Number of missing values in column Luggage.room is 19"
#> [1] "Number of missing values in column Weight is 7"
#> [1] "Number of missing values in column Origin is 5"
#> [1] "Number of missing values in column Make is 3"

12. How to replace missing values of data.table with 0?

Difficulty Level: L2 Question : Replace all missing values in DT with 0. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
DT[is.na(DT)] <- 0
print(head(DT[, 1:8]))
#>    Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:        Acura Integra   Small      12.9  15.9      18.8       25          31
#> 2:            0  Legend Midsize      29.2  33.9      38.7       18          25
#> 3:         Audi      90 Compact      25.9  29.1      32.3       20          26
#> 4:         Audi     100 Midsize       0.0  37.7      44.6       19          26
#> 5:          BMW    535i Midsize       0.0  30.0       0.0       22          30
#> 6:        Buick Century Midsize      14.2  15.7      17.3       22          31

13. How to replace missing values of numeric columns with the mean?

Difficulty Level: L2 Question : Replace missing values of numeric columns with their respective mean. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
replace_with_mean <- function(x){ifelse(is.na(x),mean(x, na.rm = TRUE),x)}
output <- DT[,lapply(.SD, replace_with_mean)]
print(head(output))
#>    Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:        Acura Integra   Small   12.9000  15.9  18.80000       25          31
#> 2:         <NA>  Legend Midsize   29.2000  33.9  38.70000       18          25
#> 3:         Audi      90 Compact   25.9000  29.1  32.30000       20          26
#> 4:         Audi     100 Midsize   17.1186  37.7  44.60000       19          26
#> 5:          BMW    535i Midsize   17.1186  30.0  21.45909       22          30
#> 6:        Buick Century Midsize   14.2000  15.7  17.30000       22          31
#>               AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
#> 1:               None      Front         4   1.800000        140 6300
#> 2: Driver & Passenger      Front         6   3.200000        200 5500
#> 3:        Driver only      Front         6   2.800000        172 5500
#> 4: Driver & Passenger       <NA>         6   2.658242        172 5500
#> 5:               <NA>       Rear         4   3.500000        208 5700
#> 6:        Driver only       <NA>         4   2.200000        110 5200
#>    Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
#> 1:         2890             Yes               13.2          5    177       102
#> 2:         2335             Yes               18.0          5    195       115
#> 3:         2280             Yes               16.9          5    180       102
#> 4:         2535            <NA>               21.1          6    193       106
#> 5:         2545             Yes               21.1          4    186       109
#> 6:         2565              No               16.4          6    189       105
#>       Width Turn.circle Rear.seat.room Luggage.room   Weight  Origin
#> 1: 68.00000          37           26.5     13.98649 2705.000 non-USA
#> 2: 71.00000          38           30.0     15.00000 3560.000 non-USA
#> 3: 67.00000          37           28.0     14.00000 3375.000 non-USA
#> 4: 69.44828          37           31.0     17.00000 3405.000 non-USA
#> 5: 69.00000          39           27.0     13.00000 3640.000 non-USA
#> 6: 69.00000          41           28.0     16.00000 3104.593     USA
#>             Make
#> 1: Acura Integra
#> 2:  Acura Legend
#> 3:       Audi 90
#> 4:      Audi 100
#> 5:      BMW 535i
#> 6: Buick Century

14. How to select a specific column from a data.table as a list (vector)?

Difficulty Level: L1 Question : Get the column Model in DT as a list. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Solution

[1] "Integra"        "Legend"         "90"             "100"
 [5] "535i"           "Century"        "LeSabre"        "Roadmaster"
 [9] "Riviera"        "DeVille"        "Seville"        "Cavalier"
[13] "Corsica"        "Camaro"         "Lumina"         "Lumina_APV"
[17] "Astro"          "Caprice"        "Corvette"       "Concorde"
[21] "LeBaron"        "Imperial"       (...truncated...)
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT <- DT[, Model]
print(DT)
#>  [1] "Integra"        "Legend"         "90"             "100"
#>  [5] "535i"           "Century"        "LeSabre"        "Roadmaster"
#>  [9] "Riviera"        "DeVille"        "Seville"        "Cavalier"
#> [13] "Corsica"        "Camaro"         "Lumina"         "Lumina_APV"
#> [17] "Astro"          "Caprice"        "Corvette"       "Concorde"
#> [21] "LeBaron"        "Imperial"       "Colt"           "Shadow"
#> [25] "Spirit"         "Caravan"        "Dynasty"        "Stealth"
#> [29] "Summit"         "Vision"         "Festiva"        "Escort"
#> [33] "Tempo"          "Mustang"        "Probe"          "Aerostar"
#> [37] "Taurus"         "Crown_Victoria" "Metro"          "Storm"
#> [41] "Prelude"        "Civic"          "Accord"         "Excel"
#> [45] "Elantra"        "Scoupe"         "Sonata"         "Q45"
#> [49] "ES300"          "SC300"          "Continental"    "Town_Car"
#> [53] "323"            "Protege"        "626"            "MPV"
#> [57] "RX-7"           "190E"           "300E"           NA
#> [61] "Cougar"         "Mirage"         "Diamante"       "Sentra"
#> [65] "Altima"         "Quest"          "Maxima"         "Achieva"
#> [69] "Cutlass_Ciera"  "Silhouette"     "Eighty-Eight"   "Laser"
#> [73] "LeMans"         "Sunbird"        "Firebird"       "Grand_Prix"
#> [77] "Bonneville"     "900"            "SL"             "Justy"
#> [81] "Loyale"         "Legacy"         "Swift"          "Tercel"
#> [85] "Celica"         "Camry"          "Previa"         "Fox"
#> [89] "Eurovan"        "Passat"         "Corrado"        "240"
#> [93] "850"

15. How to select a specific column from a data.table as a data.table?

Difficulty Level: L2 Question : Get the column Model in DT as a data.table (rather than as a list). Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Solution

     Model
1: Integra
2:  Legend
3:      90
4:     100
5:    535i
6: Century
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT <- DT[, list(Model)]
print(head(DT))
#>      Model
#> 1: Integra
#> 2:  Legend
#> 3:      90
#> 4:     100
#> 5:    535i
#> 6: Century

16. How to sort a data.table based on a given column?

Difficulty Level: L1 Question: Reorder the rows as per Price column of DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT <- DT[order(Price)]
print(head(DT))
#>    Manufacturer   Model  Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:         Ford Festiva Small       6.9   7.4       7.9       31          33
#> 2:      Hyundai   Excel Small       6.8   8.0       9.2       29          33
#> 3:        Mazda     323 Small       7.4   8.3       9.1       29          37
#> 4:          Geo   Metro Small       6.7   8.4      10.0       46          50
#> 5:       Subaru   Justy Small       7.3   8.4       9.5       33          37
#> 6:       Suzuki   Swift  <NA>       7.3   8.6        NA       39          43
#>    AirBags DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile
#> 1:    <NA>      Front         4        1.3         63 5000         3150
#> 2:    None      Front         4        1.5         81 5500         2710
#> 3:    None      Front         4        1.6         82 5000         2370
#> 4:    None      Front         3        1.0         55 5700         3755
#> 5:    None        4WD         3        1.2         73 5600         2875
#> 6:    None      Front         3        1.3         70 6000         3360
#>    Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase Width
#> 1:             Yes               10.0          4    141        90    63
#> 2:             Yes               11.9          5    168        94    63
#> 3:             Yes               13.2          4    164        97    66
#> 4:            <NA>               10.6          4    151        93    63
#> 5:             Yes                9.2          4    146        90    60
#> 6:             Yes               10.6          4    161        93    NA
#>    Turn.circle Rear.seat.room Luggage.room Weight  Origin          Make
#> 1:          33           26.0           12   1845     USA  Ford Festiva
#> 2:          35           26.0           11   2345 non-USA Hyundai Excel
#> 3:          34           27.0           16   2325 non-USA     Mazda 323
#> 4:          34           27.5           10   1695 non-USA     Geo Metro
#> 5:          32           23.5           10   2045 non-USA  Subaru Justy
#> 6:          34           27.5           10   1965 non-USA  Suzuki Swift

17. How to sort a data.table based on two or more columns?

Difficulty Level: L1 Question : Reorder the rows as per ascending order of Price column and descending order of Max.Price column of DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT <- DT[order(Price, -Max.Price)]
print(head(DT))
#>    Manufacturer   Model  Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:         Ford Festiva Small       6.9   7.4       7.9       31          33
#> 2:      Hyundai   Excel Small       6.8   8.0       9.2       29          33
#> 3:        Mazda     323 Small       7.4   8.3       9.1       29          37
#> 4:          Geo   Metro Small       6.7   8.4      10.0       46          50
#> 5:       Subaru   Justy Small       7.3   8.4       9.5       33          37
#> 6:       Suzuki   Swift  <NA>       7.3   8.6        NA       39          43
#>    AirBags DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile
#> 1:    <NA>      Front         4        1.3         63 5000         3150
#> 2:    None      Front         4        1.5         81 5500         2710
#> 3:    None      Front         4        1.6         82 5000         2370
#> 4:    None      Front         3        1.0         55 5700         3755
#> 5:    None        4WD         3        1.2         73 5600         2875
#> 6:    None      Front         3        1.3         70 6000         3360
#>    Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase Width
#> 1:             Yes               10.0          4    141        90    63
#> 2:             Yes               11.9          5    168        94    63
#> 3:             Yes               13.2          4    164        97    66
#> 4:            <NA>               10.6          4    151        93    63
#> 5:             Yes                9.2          4    146        90    60
#> 6:             Yes               10.6          4    161        93    NA
#>    Turn.circle Rear.seat.room Luggage.room Weight  Origin          Make
#> 1:          33           26.0           12   1845     USA  Ford Festiva
#> 2:          35           26.0           11   2345 non-USA Hyundai Excel
#> 3:          34           27.0           16   2325 non-USA     Mazda 323
#> 4:          34           27.5           10   1695 non-USA     Geo Metro
#> 5:          32           23.5           10   2045 non-USA  Subaru Justy
#> 6:          34           27.5           10   1965 non-USA  Suzuki Swift

18. How to filter out rows from a data.table that satisfy multiple conditions?

Difficulty Level: L2 Question : Filter out the rows having Manufacturer as Ford and Price less than 30 Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output :

   Manufacturer    Model    Type Min.Price Price Max.Price MPG.city MPG.highway
1:         Ford  Festiva   Small       6.9   7.4       7.9       31          33
2:         Ford   Escort   Small       8.4  10.1      11.9       23          30
3:         Ford    Tempo Compact      10.4  11.3      12.2       22          27
4:         Ford  Mustang  Sporty      10.8  15.9      21.0       22          29
5:         Ford    Probe  Sporty      12.8  14.0      15.2       NA          30
6:         Ford Aerostar     Van      14.5  19.9      25.3       15          20
       AirBags DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile
1:        <NA>      Front         4        1.3         63 5000         3150
2:        None      Front         4        1.8        127 6500         2410
3:        None      Front         4        2.3         96 4200         2805
4: Driver only       Rear         4        2.3        105 4600         2285
5: Driver only      Front         4        2.0        115 5500         2340
6: Driver only        4WD         6        3.0        145 4800         2080
(...truncated...)
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
sol <- DT[Manufacturer == "Ford" & Price < 30]
print(head(sol))
#>    Manufacturer    Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:         Ford  Festiva   Small       6.9   7.4       7.9       31          33
#> 2:         Ford   Escort   Small       8.4  10.1      11.9       23          30
#> 3:         Ford    Tempo Compact      10.4  11.3      12.2       22          27
#> 4:         Ford  Mustang  Sporty      10.8  15.9      21.0       22          29
#> 5:         Ford    Probe  Sporty      12.8  14.0      15.2       NA          30
#> 6:         Ford Aerostar     Van      14.5  19.9      25.3       15          20
#>        AirBags DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile
#> 1:        <NA>      Front         4        1.3         63 5000         3150
#> 2:        None      Front         4        1.8        127 6500         2410
#> 3:        None      Front         4        2.3         96 4200         2805
#> 4: Driver only       Rear         4        2.3        105 4600         2285
#> 5: Driver only      Front         4        2.0        115 5500         2340
#> 6: Driver only        4WD         6        3.0        145 4800         2080
#>    Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase Width
#> 1:             Yes               10.0          4    141        90    63
#> 2:            <NA>               13.2          5    171        98    67
#> 3:             Yes               15.9          5    177       100    68
#> 4:             Yes               15.4          4    180       101    68
#> 5:             Yes               15.5          4    179       103    70
#> 6:             Yes               21.0          7    176       119    72
#>    Turn.circle Rear.seat.room Luggage.room Weight Origin          Make
#> 1:          33           26.0           12   1845    USA  Ford Festiva
#> 2:          36           28.0           12   2530    USA   Ford Escort
#> 3:          NA           27.5           13     NA    USA          <NA>
#> 4:          40           24.0           12     NA    USA  Ford Mustang
#> 5:          38           23.0           18   2710    USA    Ford Probe
#> 6:          45           30.0           NA   3735    USA Ford Aerostar

19. How to select multiple columns from data.table and rename them?

Difficulty Level: L2 Question : Get columns ‘Manufacturer’ & ‘Type’ from data.table and rename them to ‘MANUFACTURER’ & ‘TYPE’ Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   MANUFACTURER    TYPE
1:        Acura   Small
2:         <NA> Midsize
3:         Audi Compact
4:         Audi Midsize
5:          BMW Midsize
6:        Buick Midsize
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
sol <- DT[, .(MANUFACTURER = Manufacturer, TYPE = Type)]
print(head(sol))
#>    MANUFACTURER    TYPE
#> 1:        Acura   Small
#> 2:         <NA> Midsize
#> 3:         Audi Compact
#> 4:         Audi Midsize
#> 5:          BMW Midsize
#> 6:        Buick Midsize

20. How to get mean of rows that satisfy a condition from a given column?

Difficulty Level: L2 Question : Get mean of all the vehicles having Price greater than 30. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output :

38.6833
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[Price > 30, mean(Price, na.rm = TRUE)]
output

38.6833333333333

21. How to remove only specified columns from a data.table?

Difficulty Level: L2 Question : Create new data.table by removing ‘Manufacturer’ & ‘Type’ columns. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, !c("Manufacturer", "Type")]
print(head(output))
#>      Model Min.Price Price Max.Price MPG.city MPG.highway            AirBags
#> 1: Integra      12.9  15.9      18.8       25          31               None
#> 2:  Legend      29.2  33.9      38.7       18          25 Driver & Passenger
#> 3:      90      25.9  29.1      32.3       20          26        Driver only
#> 4:     100        NA  37.7      44.6       19          26 Driver & Passenger
#> 5:    535i        NA  30.0        NA       22          30               <NA>
#> 6: Century      14.2  15.7      17.3       22          31        Driver only
#>    DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile Man.trans.avail
#> 1:      Front         4        1.8        140 6300         2890             Yes
#> 2:      Front         6        3.2        200 5500         2335             Yes
#> 3:      Front         6        2.8        172 5500         2280             Yes
#> 4:       <NA>         6         NA        172 5500         2535            <NA>
#> 5:       Rear         4        3.5        208 5700         2545             Yes
#> 6:       <NA>         4        2.2        110 5200         2565              No
#>    Fuel.tank.capacity Passengers Length Wheelbase Width Turn.circle
#> 1:               13.2          5    177       102    68          37
#> 2:               18.0          5    195       115    71          38
#> 3:               16.9          5    180       102    67          37
#> 4:               21.1          6    193       106    NA          37
#> 5:               21.1          4    186       109    69          39
#> 6:               16.4          6    189       105    69          41
#>    Rear.seat.room Luggage.room Weight  Origin          Make
#> 1:           26.5           NA   2705 non-USA Acura Integra
#> 2:           30.0           15   3560 non-USA  Acura Legend
#> 3:           28.0           14   3375 non-USA       Audi 90
#> 4:           31.0           17   3405 non-USA      Audi 100
#> 5:           27.0           13   3640 non-USA      BMW 535i
#> 6:           28.0           16     NA     USA Buick Century

22. How to calculate count of each unique value in a given column?

Difficulty Level: L2 Question : Calculate number of records for every Manufacturer in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer N
1:        Acura 1
2:         <NA> 4
3:         Audi 2
4:          BMW 1
5:        Buick 4
6:     Cadillac 2
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, .(.N), by = .(Manufacturer)]
print(head(output))
#>    Manufacturer N
#> 1:        Acura 1
#> 2:         <NA> 4
#> 3:         Audi 2
#> 4:          BMW 1
#> 5:        Buick 4
#> 6:     Cadillac 2

23. How to find mean of a column grouped by multiple columns?

Difficulty Level: L2 Question : Calculate mean Price for every Manufacturer, Type combination in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer    Type       V1
1:        Acura   Small 15.90000
2:         <NA> Midsize 31.93333
3:         Audi Compact 29.10000
4:         Audi Midsize 37.70000
5:          BMW Midsize 30.00000
6:        Buick Midsize 21.00000
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, mean(Price, na.rm = TRUE), by = .(Manufacturer, Type)]
print(head(output))
#>    Manufacturer    Type       V1
#> 1:        Acura   Small 15.90000
#> 2:         <NA> Midsize 31.93333
#> 3:         Audi Compact 29.10000
#> 4:         Audi Midsize 37.70000
#> 5:          BMW Midsize 30.00000
#> 6:        Buick Midsize 21.00000

24. How to find mean of column grouped by multiple columns and sort by grouped columns?

Difficulty Level: L2 Question : Calculate mean Price for every Manufacturer, Type combination and arrange it by the keys in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer    Type    V1
1:        Acura   Small 15.90
2:         Audi Compact 29.10
3:         Audi Midsize 37.70
4:          BMW Midsize 30.00
5:        Buick   Large 22.25
6:        Buick Midsize 21.00
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution 1
output <- DT[, mean(Price, na.rm = TRUE), keyby = .(Manufacturer, Type)]

#Solution 1
output <- DT[, mean(Price, na.rm = TRUE), by = .(Manufacturer, Type)][order(Manufacturer, Type)]
print(head(output))
#>    Manufacturer    Type    V1
#> 1:        Acura   Small 15.90
#> 2:         Audi Compact 29.10
#> 3:         Audi Midsize 37.70
#> 4:          BMW Midsize 30.00
#> 5:        Buick   Large 22.25
#> 6:        Buick Midsize 21.00

25. How to select all numeric columns from data.table?

Difficulty Level: L2 Question : Select numeric columns from DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Min.Price Price Max.Price MPG.city MPG.highway EngineSize Horsepower  RPM
1:      12.9  15.9      18.8       25          31        1.8        140 6300
2:      29.2  33.9      38.7       18          25        3.2        200 5500
3:      25.9  29.1      32.3       20          26        2.8        172 5500
4:        NA  37.7      44.6       19          26         NA        172 5500
5:        NA  30.0        NA       22          30        3.5        208 5700
6:      14.2  15.7      17.3       22          31        2.2        110 5200
   Rev.per.mile Fuel.tank.capacity Passengers Length Wheelbase Width
1:         2890               13.2          5    177       102    68
2:         2335               18.0          5    195       115    71
3:         2280               16.9          5    180       102    67
4:         2535               21.1          6    193       106    NA
5:         2545               21.1          4    186       109    69
6:         2565               16.4          6    189       105    69
(...truncated...)
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution 1
output <- DT[, .SD, .SDcols = which(sapply(DT, is.numeric))]
print(head(output))
#>    Min.Price Price Max.Price MPG.city MPG.highway EngineSize Horsepower  RPM
#> 1:      12.9  15.9      18.8       25          31        1.8        140 6300
#> 2:      29.2  33.9      38.7       18          25        3.2        200 5500
#> 3:      25.9  29.1      32.3       20          26        2.8        172 5500
#> 4:        NA  37.7      44.6       19          26         NA        172 5500
#> 5:        NA  30.0        NA       22          30        3.5        208 5700
#> 6:      14.2  15.7      17.3       22          31        2.2        110 5200
#>    Rev.per.mile Fuel.tank.capacity Passengers Length Wheelbase Width
#> 1:         2890               13.2          5    177       102    68
#> 2:         2335               18.0          5    195       115    71
#> 3:         2280               16.9          5    180       102    67
#> 4:         2535               21.1          6    193       106    NA
#> 5:         2545               21.1          4    186       109    69
#> 6:         2565               16.4          6    189       105    69
#>    Turn.circle Rear.seat.room Luggage.room Weight
#> 1:          37           26.5           NA   2705
#> 2:          38           30.0           15   3560
#> 3:          37           28.0           14   3375
#> 4:          37           31.0           17   3405
#> 5:          39           27.0           13   3640
#> 6:          41           28.0           16     NA

26. How to calculate mean of all numeric columns for every Manufacturer?

Difficulty Level: L3 Question : Calculate mean of all numeric columns for every Manufacturer Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer Min.Price  Price Max.Price MPG.city MPG.highway EngineSize
1:        Acura    12.900 15.900     18.80     25.0       31.00      1.800
2:         <NA>    26.775 28.550     30.30     19.0       26.00      2.975
3:         Audi        NA 33.400     38.45     19.5       26.00         NA
4:          BMW        NA 30.000        NA     22.0       30.00      3.500
5:        Buick    20.750 21.625        NA     19.0       27.75      3.875
6:     Cadillac    35.250 37.400     39.50     16.0       25.00      4.750
(...truncated...)
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, .SD, .SDcols = which(sapply(DT, is.numeric))]
output <- cbind(output, DT[, list(Manufacturer)])
output <- output[, lapply(.SD, mean), by = Manufacturer]
print(head(output))
#>    Manufacturer Min.Price  Price Max.Price MPG.city MPG.highway EngineSize
#> 1:        Acura    12.900 15.900     18.80     25.0       31.00      1.800
#> 2:         <NA>    26.775 28.550     30.30     19.0       26.00      2.975
#> 3:         Audi        NA 33.400     38.45     19.5       26.00         NA
#> 4:          BMW        NA 30.000        NA     22.0       30.00      3.500
#> 5:        Buick    20.750 21.625        NA     19.0       27.75      3.875
#> 6:     Cadillac    35.250 37.400     39.50     16.0       25.00      4.750
#>    Horsepower  RPM Rev.per.mile Fuel.tank.capacity Passengers Length Wheelbase
#> 1:      140.0 6300       2890.0               13.2       5.00 177.00    102.00
#> 2:      186.5 5750           NA                 NA       5.00 193.25    109.75
#> 3:      172.0 5500       2407.5               19.0       5.50 186.50    104.00
#> 4:      208.0 5700       2545.0               21.1       4.00 186.00    109.00
#> 5:      157.5 4700           NA                 NA       5.75 200.75    110.00
#> 6:      247.5 5050           NA               19.0       5.50 205.00    112.50
#>    Width Turn.circle Rear.seat.room Luggage.room  Weight
#> 1: 68.00       37.00         26.500           NA 2705.00
#> 2: 71.25          NA         29.000         13.5 3458.75
#> 3:    NA       37.00         29.500         15.5 3390.00
#> 4: 69.00       39.00         27.000         13.0 3640.00
#> 5:    NA       42.25         28.875         17.0      NA
#> 6: 73.50       43.50         33.000           NA 3777.50

27. How to get first 3 rows for every Manufacturer?

Difficulty Level: L3 Question : Get first 3 rows for every Manufacturer in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
1:        Acura Integra   Small      12.9  15.9      18.8       25          31
2:         Audi      90 Compact      25.9  29.1      32.3       20          26
3:         Audi     100 Midsize        NA  37.7      44.6       19          26
4:          BMW    535i Midsize        NA  30.0        NA       22          30
5:        Buick Century Midsize      14.2  15.7      17.3       22          31
6:        Buick LeSabre   Large      19.9  20.8        NA       19          28
(...truncated...)
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[!is.na(Manufacturer), head(.SD, 3), by = Manufacturer]
print(head(output))
#>    Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:        Acura Integra   Small      12.9  15.9      18.8       25          31
#> 2:         Audi      90 Compact      25.9  29.1      32.3       20          26
#> 3:         Audi     100 Midsize        NA  37.7      44.6       19          26
#> 4:          BMW    535i Midsize        NA  30.0        NA       22          30
#> 5:        Buick Century Midsize      14.2  15.7      17.3       22          31
#> 6:        Buick LeSabre   Large      19.9  20.8        NA       19          28
#>               AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
#> 1:               None      Front         4        1.8        140 6300
#> 2:        Driver only      Front         6        2.8        172 5500
#> 3: Driver & Passenger       <NA>         6         NA        172 5500
#> 4:               <NA>       Rear         4        3.5        208 5700
#> 5:        Driver only       <NA>         4        2.2        110 5200
#> 6:        Driver only      Front         6        3.8        170 4800
#>    Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
#> 1:         2890             Yes               13.2          5    177       102
#> 2:         2280             Yes               16.9          5    180       102
#> 3:         2535            <NA>               21.1          6    193       106
#> 4:         2545             Yes               21.1          4    186       109
#> 5:         2565              No               16.4          6    189       105
#> 6:           NA              No                 NA          6    200       111
#>    Width Turn.circle Rear.seat.room Luggage.room Weight  Origin          Make
#> 1:    68          37           26.5           NA   2705 non-USA Acura Integra
#> 2:    67          37           28.0           14   3375 non-USA       Audi 90
#> 3:    NA          37           31.0           17   3405 non-USA      Audi 100
#> 4:    69          39           27.0           13   3640 non-USA      BMW 535i
#> 5:    69          41           28.0           16     NA     USA Buick Century
#> 6:    74          42           30.5           17   3470     USA Buick LeSabre

28. How to remove specific column from data.table?

Difficulty Level: L2 Question : Remove column Model from DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT[, Model := NULL]
print(head(DT))
#>    Manufacturer    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:        Acura   Small      12.9  15.9      18.8       25          31
#> 2:         <NA> Midsize      29.2  33.9      38.7       18          25
#> 3:         Audi Compact      25.9  29.1      32.3       20          26
#> 4:         Audi Midsize        NA  37.7      44.6       19          26
#> 5:          BMW Midsize        NA  30.0        NA       22          30
#> 6:        Buick Midsize      14.2  15.7      17.3       22          31
#>               AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
#> 1:               None      Front         4        1.8        140 6300
#> 2: Driver & Passenger      Front         6        3.2        200 5500
#> 3:        Driver only      Front         6        2.8        172 5500
#> 4: Driver & Passenger       <NA>         6         NA        172 5500
#> 5:               <NA>       Rear         4        3.5        208 5700
#> 6:        Driver only       <NA>         4        2.2        110 5200
#>    Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
#> 1:         2890             Yes               13.2          5    177       102
#> 2:         2335             Yes               18.0          5    195       115
#> 3:         2280             Yes               16.9          5    180       102
#> 4:         2535            <NA>               21.1          6    193       106
#> 5:         2545             Yes               21.1          4    186       109
#> 6:         2565              No               16.4          6    189       105
#>    Width Turn.circle Rear.seat.room Luggage.room Weight  Origin          Make
#> 1:    68          37           26.5           NA   2705 non-USA Acura Integra
#> 2:    71          38           30.0           15   3560 non-USA  Acura Legend
#> 3:    67          37           28.0           14   3375 non-USA       Audi 90
#> 4:    NA          37           31.0           17   3405 non-USA      Audi 100
#> 5:    69          39           27.0           13   3640 non-USA      BMW 535i
#> 6:    69          41           28.0           16     NA     USA Buick Century

29. How to set key to data.table?

Difficulty Level: L1 Question : Set column AirBags as key to the data.table Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
setkey(DT,AirBags)

30. How to get all rows where AirBags are at 'Driver & Passenger' in DT?

Difficulty Level: L2 Question : Get all rows where AirBags are Driver & Passenger in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
setkey(DT,AirBags)
print(head(DT["Driver & Passenger"]))
#>    Manufacturer    Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:         <NA>   Legend Midsize      29.2  33.9      38.7       18          25
#> 2:         Audi      100 Midsize        NA  37.7      44.6       19          26
#> 3:     Cadillac  Seville Midsize      37.5  40.1      42.7       16          25
#> 4:    Chevrolet   Camaro  Sporty      13.4  15.1      16.8       19          28
#> 5:         <NA> Concorde   Large      18.4  18.4      18.4       20          28
#> 6:     Chrysler  LeBaron Compact      14.5  15.8      17.1       23          28
#>               AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
#> 1: Driver & Passenger      Front         6        3.2        200 5500
#> 2: Driver & Passenger       <NA>         6         NA        172 5500
#> 3: Driver & Passenger      Front         8        4.6        295 6000
#> 4: Driver & Passenger       Rear      <NA>        3.4        160 4600
#> 5: Driver & Passenger      Front         6        3.3        153 5300
#> 6: Driver & Passenger      Front         4        3.0        141 5000
#>    Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
#> 1:         2335             Yes               18.0          5    195       115
#> 2:         2535            <NA>               21.1          6    193       106
#> 3:         1985              No               20.0          5    204       111
#> 4:         1805             Yes                 NA          4    193       101
#> 5:         1990              No               18.0          6    203       113
#> 6:         2090              No               16.0          6    183       104
#>    Width Turn.circle Rear.seat.room Luggage.room Weight  Origin
#> 1:    71          38           30.0           15   3560 non-USA
#> 2:    NA          37           31.0           17   3405 non-USA
#> 3:    74          44           31.0           NA   3935     USA
#> 4:    74          43           25.0           13   3240     USA
#> 5:    74          NA           31.0           15   3515     USA
#> 6:    68          41           30.5           14   3085     USA
#>                 Make
#> 1:      Acura Legend
#> 2:          Audi 100
#> 3:  Cadillac Seville
#> 4:  Chevrolet Camaro
#> 5: Chrylser Concorde
#> 6:  Chrysler LeBaron

31. How to get all rows where AirBags are either 'Driver & Passenger' or 'No data'?

Difficulty Level: L2 Question : Get all rows where AirBags are Driver & Passenger & No data. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

Show Solution
#Input
library(data.table)
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
setkey(DT,AirBags)
print(DT[c("Driver & Passenger", "No data")])
#>      Manufacturer       Model    Type Min.Price Price Max.Price MPG.city
#>  1:          <NA>      Legend Midsize      29.2  33.9      38.7       18
#>  2:          Audi         100 Midsize        NA  37.7      44.6       19
#>  3:      Cadillac     Seville Midsize      37.5  40.1      42.7       16
#>  4:     Chevrolet      Camaro  Sporty      13.4  15.1      16.8       19
#>  5:          <NA>    Concorde   Large      18.4  18.4      18.4       20
#>  6:      Chrysler     LeBaron Compact      14.5  15.8      17.1       23
#>  7:         Eagle      Vision   Large        NA  19.3      21.2       20
#>  8:         Honda     Prelude  Sporty      17.0  19.8      22.7       24
#>  9:         Honda      Accord Compact      13.8  17.5      21.2       24
#> 10:          <NA>       SC300 Midsize      34.7  35.2      35.6       18
#> 11:       Lincoln Continental Midsize      33.3  34.3      35.3       17
#> 12:       Lincoln    Town_Car   Large      34.4  36.1      37.8       18
#> 13: Mercedes-Benz        300E Midsize      43.8  61.9      80.0       19
#> 14:       Pontiac    Firebird    <NA>      14.0  17.7      21.4       19
#> 15:       Pontiac  Bonneville   Large      19.4  24.4      29.4       19
#> 16:          <NA>         850 Midsize      24.8  26.7      28.5       20
#> 17:          <NA>        <NA>    <NA>        NA    NA        NA       NA
#>     MPG.highway            AirBags DriveTrain Cylinders EngineSize Horsepower
#>  1:          25 Driver & Passenger      Front         6        3.2        200
#>  2:          26 Driver & Passenger       <NA>         6         NA        172
#>  3:          25 Driver & Passenger      Front         8        4.6        295
#>  4:          28 Driver & Passenger       Rear      <NA>        3.4        160
#>  5:          28 Driver & Passenger      Front         6        3.3        153
#>  6:          28 Driver & Passenger      Front         4        3.0        141
#>  7:          28 Driver & Passenger      Front         6        3.5         NA
#>  8:          31 Driver & Passenger      Front         4        2.3        160
#>  9:          31 Driver & Passenger      Front         4        2.2        140
#> 10:          23 Driver & Passenger       Rear         6        3.0        225
#> 11:          26 Driver & Passenger       <NA>         6        3.8        160
#> 12:          26 Driver & Passenger       Rear         8        4.6        210
#> 13:          25 Driver & Passenger       Rear         6        3.2        217
#> 14:          28 Driver & Passenger       Rear         6         NA        160
#> 15:          28 Driver & Passenger      Front         6        3.8        170
#> 16:          28 Driver & Passenger      Front         5        2.4        168
#> 17:          NA            No data       <NA>      <NA>         NA         NA
#>      RPM Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length
#>  1: 5500         2335             Yes               18.0          5    195
#>  2: 5500         2535            <NA>               21.1          6    193
#>  3: 6000         1985              No               20.0          5    204
#>  4: 4600         1805             Yes                 NA          4    193
#>  5: 5300         1990              No               18.0          6    203
#>  6: 5000         2090              No               16.0          6    183
#>  7: 5800         1980              No               18.0          6    202
#>  8: 5800         2855             Yes                 NA          4    175
#>  9: 5600           NA             Yes               17.0          4    185
#> 10: 6000         2510             Yes                 NA          4    191
#> 11: 4400         1835              No               18.4          6    205
#> 12: 4600         1840              No               20.0         NA    219
#> 13: 5500         2220              No               18.5          5     NA
#> 14: 4600         1805             Yes               15.5          4    196
#> 15: 4800         1565              No               18.0          6    177
#> 16: 6200           NA             Yes               19.3          5    184
#> 17:   NA           NA            <NA>                 NA         NA     NA
#>     Wheelbase Width Turn.circle Rear.seat.room Luggage.room Weight  Origin
#>  1:       115    71          38           30.0           15   3560 non-USA
#>  2:       106    NA          37           31.0           17   3405 non-USA
#>  3:       111    74          44           31.0           NA   3935     USA
#>  4:       101    74          43           25.0           13   3240     USA
#>  5:       113    74          NA           31.0           15   3515     USA
#>  6:       104    68          41           30.5           14   3085     USA
#>  7:       113    74          40           30.0           15   3490     USA
#>  8:       100    70          39           23.5            8   2865 non-USA
#>  9:       107    67          41           28.0           14   3040 non-USA
#> 10:       106    71          39           25.0            9   3515 non-USA
#> 11:       109    73          42           30.0           19   3695     USA
#> 12:       117    77          45           31.5           22   4055     USA
#> 13:       110    69          37             NA           15   3525 non-USA
#> 14:       101    75          43           25.0           13   3240     USA
#> 15:       111    74          43           30.5           18   3495     USA
#> 16:       105    69          38           30.0           15   3245 non-USA
#> 17:        NA    NA          NA             NA           NA     NA    <NA>
#>                    Make
#>  1:        Acura Legend
#>  2:            Audi 100
#>  3:    Cadillac Seville
#>  4:    Chevrolet Camaro
#>  5:   Chrylser Concorde
#>  6:    Chrysler LeBaron
#>  7:        Eagle Vision
#>  8:       Honda Prelude
#>  9:        Honda Accord
#> 10:         Lexus SC300
#> 11: Lincoln Continental
#> 12:    Lincoln Town_Car
#> 13:  Mercedes-Benz 300E
#> 14:    Pontiac Firebird
#> 15:  Pontiac Bonneville
#> 16:           Volvo 850
#> 17:                <NA>

33. How to get last and 2nd last (penultimate) row of data.table?

Difficulty Level: L2 Question 1 : Get penultimate row of DT. Question 2 : Get last row of DT. Input:

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output:

   Manufacturer Model    Type Min.Price Price Max.Price MPG.city MPG.highway
1:         <NA>   850 Midsize      24.8  26.7      28.5       20          28
2:        Volvo   240 Compact      21.8  22.7      23.5       21          28
              AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
1: Driver & Passenger      Front         5        2.4        168 6200
2:        Driver only       Rear      <NA>        2.3        114 5400
   Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
1:           NA             Yes               19.3          5    184       105
2:         2215             Yes               15.8          5    190       104
   Width Turn.circle Rear.seat.room Luggage.room Weight  Origin      Make
1:    69          38           30.0           15   3245 non-USA Volvo 850
2:    67          37           29.5           14   2985 non-USA Volvo 240
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
output <- DT[c(.N, .N - 1)]
print(output)
#>    Manufacturer Model    Type Min.Price Price Max.Price MPG.city MPG.highway
#> 1:         <NA>   850 Midsize      24.8  26.7      28.5       20          28
#> 2:        Volvo   240 Compact      21.8  22.7      23.5       21          28
#>               AirBags DriveTrain Cylinders EngineSize Horsepower  RPM
#> 1: Driver & Passenger      Front         5        2.4        168 6200
#> 2:        Driver only       Rear      <NA>        2.3        114 5400
#>    Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase
#> 1:           NA             Yes               19.3          5    184       105
#> 2:         2215             Yes               15.8          5    190       104
#>    Width Turn.circle Rear.seat.room Luggage.room Weight  Origin      Make
#> 1:    69          38           30.0           15   3245 non-USA Volvo 850
#> 2:    67          37           29.5           14   2985 non-USA Volvo 240

34. How to reorder columns of data.table?

Difficulty Level: L2 Question : Reorder columns of DT as V2 , V1, V3 Input

DT <- data.table(V1= c("a","b","c","d"), V2 =c("1","2","3","4"), V3 = c("aa","bb","cc","dd") )

Desired Output

   V2 V1 V3
1:  1  a aa
2:  2  b bb
3:  3  c cc
4:  4  d dd
Show Solution
# Input
DT <- data.table(V1= c("a","b","c","d"), V2 =c("1","2","3","4"), V3 = c("aa","bb","cc","dd") )

#Solution
output <- setcolorder(DT,c("V2","V1","V3"))
print(output)
#>    V2 V1 V3
#> 1:  1  a aa
#> 2:  2  b bb
#> 3:  3  c cc
#> 4:  4  d dd

35. How to select one column and compute standard deviation of another column and return a single value that gets recycled?

Difficulty Level: L2 Question : Select column Manufacturer and compute standard deviation of column Price and return a single value that gets recycled. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output:

   Manufacturer Sd.Price
1:        Acura  9.72428
2:         <NA>  9.72428
3:         Audi  9.72428
4:         Audi  9.72428
5:          BMW  9.72428
6:        Buick  9.72428
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[,.(Manufacturer, Sd.Price = sd(Price, na.rm = TRUE))]
print(head(output))
#>    Manufacturer Sd.Price
#> 1:        Acura  9.72428
#> 2:         <NA>  9.72428
#> 3:         Audi  9.72428
#> 4:         Audi  9.72428
#> 5:          BMW  9.72428
#> 6:        Buick  9.72428

36. How to use row indexing, column indexing and group by expressions all together?

Difficulty Level: L2 Question : Calculate sum of Weight of cars under every Manufacturer but exclude all 'Midsize' Type cars. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Manufacturer    V1
1:        Acura  2705
2:         Audi  3375
3:        Buick  7575
4:     Cadillac  3620
5:    Chevrolet 23545
6:         <NA>  3515
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output = DT[Type !="Midsize", sum(Weight), by=Manufacturer]
print(head(output))
#>    Manufacturer    V1
#> 1:        Acura  2705
#> 2:         Audi  3375
#> 3:        Buick  7575
#> 4:     Cadillac  3620
#> 5:    Chevrolet 23545
#> 6:         <NA>  3515

37. How to get the row number of the nth largest value in a column?

Difficulty Level: L2 Question : Find the row position of the 5th largest value of column Price in DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
DT <- DT[order(Price)]
fifth_largest_price = DT[5, Price]
output = DT[Price == fifth_largest_price, which = TRUE]
output
  1. 4
  2. 5

38. How to find and cap outliers from a data.table column?

Difficulty Level: L2 Question: Replace all values of Length column in the lower 5%ile and greater than 95%ile with respective 5th and 95th %ile value. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
# Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

# Solution
DT[Length > quantile(Length, .95, na.rm=T), Length := round(quantile(DT$Length, .95, na.rm=T))]
DT[Length < quantile(Length, .05, na.rm=T), Length := round(quantile(DT$Length, .05, na.rm=T))]

39. How to swap two column values based on a condition in another column of a data.table?

Difficulty Level: L2 Question : Swap column V1 & V3 for all the rows where V2 = 2. Input

DT <- data.table(V1= c("a","b","c","d"),
                 V2 =c("1","2","2","3"),
                 V3 = c("aa","bb","cc","dd") )

Desired Output:

   V1 V2 V3
1:  a  1 aa
2: bb  2  b
3: cc  2  c
4:  d  3 dd
Show Solution
# Input
DT <- data.table(V1= c("a","b","c","d"), V2 =c("1","2","2","3"), V3 = c("aa","bb","cc","dd") )

#Solution
DT[V2=="2", c("V3", "V1") := .(V1, V3)]
print(DT)
#>    V1 V2 V3
#> 1:  a  1 aa
#> 2: bb  2  b
#> 3: cc  2  c
#> 4:  d  3 dd

40. How to swap two rows of a dataframe?

Difficulty Level: L2 Questions : Swap rows 1 and 2 in DT. Input

DT <- data.table(V1= c("a","b","c","d"),
                 V2 =c("1","2","2","3"),
                 V3 = c("aa","bb","cc","dd") )

Desired Output

   V1 V2 V3
1:  b  2 bb
2:  a  1 aa
3:  c  2 cc
4:  d  3 dd
Show Solution
# Input
DT <- data.table(V1= c("a","b","c","d"), V2 =c("1","2","2","3"), V3 = c("aa","bb","cc","dd") )

# Solution
swap_rows <- function(dt, i1, i2){
    i1_row <- DT[i1,]
    i2_row <- DT[i2,]
    DT[i1,] <- i2_row
    DT[i2,] <- i1_row
    return(DT)
}

output <- swap_rows(DT, 1,2)
print(output)
#>    V1 V2 V3
#> 1:  b  2 bb
#> 2:  a  1 aa
#> 3:  c  2 cc
#> 4:  d  3 dd

41. How to reverse the rows of a data.table?

Difficulty Level: L2 Question : Reverse all the rows of DT so that topmost row goes to bottom. Input

DT <- data.table(V1= c("a","b","c","d"),
                 V2 =c("1","2","2","3"),
                 V3 = c("aa","bb","cc","dd") )

Desired Output

     V1  V2  V3
[1,] "d" "3" "dd"
[2,] "c" "2" "cc"
[3,] "b" "2" "bb"
[4,] "a" "1" "aa"
Show Solution
# Input
DT <- data.table(V1= c("a","b","c","d"), V2 =c("1","2","2","3"), V3 = c("aa","bb","cc","dd") )

# Solution
output <- do.call(cbind, lapply(DT, rev))
print(output)
#>      V1  V2  V3
#> [1,] "d" "3" "dd"
#> [2,] "c" "2" "cc"
#> [3,] "b" "2" "bb"
#> [4,] "a" "1" "aa"

42. How to create one-hot encodings of a categorical variable (dummy variables)?

Difficulty Level: L2 Question : Get one-hot encodings for columns Gender & Degree in the data.table DT and append it as columns. Input

DT <- data.table(Gender = c("M","M","F","F"), E_Id =c(1,2,3,4), Degree = c("UG","PG","PhD","UG") )
   Gender E_Id Degree
1:      M    1     UG
2:      M    2     PG
3:      F    3    PhD
4:      F    4     UG

Desired Output

   E_Id Gender_F Gender_M Degree_PG Degree_PhD Degree_UG
1:    1        0        1         0          0         1
2:    2        0        1         1          0         0
3:    3        1        0         0          1         0
4:    4        1        0         0          0         1
Show Solution
# Input
DT <- data.table(Gender = c("M","M","F","F"), E_Id =c(1,2,3,4), Degree = c("UG","PG","PhD","UG") )

# Solution
output <- dcast(melt(DT, id.vars='E_Id'), E_Id ~ variable + value, fun = length)
print(output)
#>    E_Id Gender_F Gender_M Degree_PG Degree_PhD Degree_UG
#> 1:    1        0        1         0          0         1
#> 2:    2        0        1         1          0         0
#> 3:    3        1        0         0          1         0
#> 4:    4        1        0         0          0         1

‘

43. How to find median value in each numeric column in R data.table?

Difficulty Level: L2 Question : Find row-wise sum values of DT. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

   Min.Price Price Max.Price MPG.city MPG.highway EngineSize Horsepower  RPM
1:      14.6  17.7     19.15       21          28        2.3        140 5200
   Rev.per.mile Fuel.tank.capacity Passengers Length Wheelbase Width
1:         2360               16.5          5    181       103    69
   Turn.circle Rear.seat.room Luggage.room Weight
1:          39           27.5           14   3085
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, .SD, .SDcols = which(sapply(DT, is.numeric))]
output <- output[, lapply(.SD, median, na.rm = TRUE)]
print(head(output))
#>    Min.Price Price Max.Price MPG.city MPG.highway EngineSize Horsepower  RPM
#> 1:      14.6  17.7     19.15       21          28        2.3        140 5200
#>    Rev.per.mile Fuel.tank.capacity Passengers Length Wheelbase Width
#> 1:         2360               16.5          5    181       103    69
#>    Turn.circle Rear.seat.room Luggage.room Weight
#> 1:          39           27.5           14   3085

44. How to compute correlation score of each column against other columns?

Difficulty Level: L2 Question : Compute correlation score of each column against other columns. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, .SD, .SDcols = which(sapply(DT, is.numeric))]
print(cor(output, use = "na.or.complete"))

45. How to create a column containing the minimum by maximum of each row?

Difficulty Level: L2 Question : Compute the minimum-by-maximum for every row of df.

DT <- data.table(V1 = runif(10, 1, 100),
                 V2 = runif(10, 1, 80),
                 V3 = runif(10, 1, 100))
Show Solution
# Input
DT <- data.table(V1= runif(10, 1, 100), V2 =runif(10, 1, 80), V3 = runif(10, 1, 100))

#Solution
DT[,max_min:=do.call(pmin,.SD)/do.call(pmax,.SD)]
print(head(DT))

# Solution 2
DT <- data.table(V1= runif(10, 1, 100), V2 =runif(10, 1, 80), V3 = runif(10, 1, 100))
DT[, max_min2:=apply(.SD, 1, min)/apply(.SD, 1, max)]
print(head(DT))
#>          V1       V2       V3   max_min
#> 1: 16.33154 66.08863 41.38638 0.2471157
#> 2: 87.79467 38.57875 38.50150 0.4385404
#> 3: 40.95019 19.47167 15.03562 0.3671685
#> 4: 12.40790 17.68716 34.95050 0.3550136
#> 5: 34.15262 24.52459 71.04999 0.3451738
#> 6: 60.22314 60.22538 10.79905 0.1793106

46. How to scale all columns in a dataframe?

Difficulty Level: L2 Question : Normalize all columns in DT. Without using external packages. Input

DT <- data.table(V1= runif(10, 1, 100),
                 V2 =runif(10, 1, 80),
                 V3 = runif(10, 1, 100))
Show Solution
# Input
DT <- data.table(V1= runif(10, 1, 100), V2 =runif(10, 1, 80), V3 = runif(10, 1, 100))

# Solution
output <- DT[, lapply(.SD, scale)]
print(output)
#>          V1.V1      V2.V1       V3.V1
#>  1:  0.9884659 -1.2595111  0.09593436
#>  2:  0.1217149 -0.8867426 -0.31629923
#>  3:  0.5872020  0.1443417  0.70839114
#>  4: -0.5178531  0.5737876  1.12962574
#>  5:  1.0221688 -0.9475154 -0.63975308
#>  6: -1.5091412  1.2276058  1.11944272
#>  7: -0.9203772  1.0074295 -0.33182208
#>  8: -0.8005338  1.3745140 -1.41247525
#>  9:  1.5281054 -0.9386551 -1.45771901
#> 10: -0.4997516 -0.2952545  1.10467468

47. How to compute the correlation of each column with the succeeding column?

Difficulty Level: L2 Compute the correlation of each column of df with its succeeding column. Input

DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

Desired Output

                 Price
   Min.Price 0.9705018
             Max.Price
       Price 0.9802519
              MPG.city
  Max.Price -0.5377239
           MPG.highway
  MPG.city   0.9479157
            EngineSize
MPG.highway -0.6259651
            Horsepower
 EngineSize  0.7313269
                   RPM
 Horsepower 0.04736874
          Rev.per.mile
      RPM    0.4623314
(...truncated...)
Show Solution
#Input
DT <-  fread('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')

#Solution
output <- DT[, .SD, .SDcols = which(sapply(DT, is.numeric))]  # numeric columns

for (i in 1:(ncol(output) - 1)){
    a <- i + 1
    print(cor(output[,..i], output[,..a], use = "na.or.complete"))
}
#>               Price
#> Min.Price 0.9705018
#>       Max.Price
#> Price 0.9802519
#>             MPG.city
#> Max.Price -0.5377239
#>          MPG.highway
#> MPG.city   0.9479157
#>             EngineSize
#> MPG.highway -0.6259651
#>            Horsepower
#> EngineSize  0.7313269
#>                   RPM
#> Horsepower 0.04736874
#>     Rev.per.mile
#> RPM    0.4623314
#>              Fuel.tank.capacity
#> Rev.per.mile         -0.6318497
#>                    Passengers
#> Fuel.tank.capacity  0.4965661
#>               Length
#> Passengers 0.4737477
#>        Wheelbase
#> Length 0.8275146
#>               Width
#> Wheelbase 0.8127431
#>       Turn.circle
#> Width   0.8170549
#>             Rear.seat.room
#> Turn.circle      0.4738118
#>                Luggage.room
#> Rear.seat.room     0.668847
#>                 Weight
#> Luggage.room 0.6425643

48. How to replace both the diagonals of data.table with 0?

Difficulty Level: L2 Replace both values in both diagonals of DT with 0. Input

DT <- data.table(V1= runif(4, 1, 100), V2 =runif(4, 1, 80), V3 = runif(4, 1, 100), V4 = runif(4,1, 50))

          V1        V2        V3       V4
1: 97.451642 65.393451  6.496714 27.80014
2: 56.475427  5.234317 80.551154 10.86617
3: 65.965884 18.954913 70.968490 25.92509
4:  3.723218 26.590925 75.723006 42.22132

Desired output

         V1       V2        V3       V4
1:  0.00000 65.39345  6.496714  0.00000
2: 56.47543  0.00000  0.000000 10.86617
3: 65.96588  0.00000  0.000000 25.92509
4:  0.00000 26.59093 75.723006  0.00000
Show Solution
# Input
DT <- data.table(V1= runif(4, 1, 100), V2 =runif(4, 1, 80), V3 = runif(4, 1, 100), V4 = runif(4,1, 50))

# Solution
for (i in 1:nrow(DT)){
    DT[i,i] <- 0
    DT[nrow(DT) - i + 1, i] <- 0
}
print(DT)
#>          V1       V2       V3        V4
#> 1:  0.00000 72.08959 12.63875  0.000000
#> 2: 17.61880  0.00000  0.00000  1.696741
#> 3: 82.20107  0.00000  0.00000 40.321027
#> 4:  0.00000 40.47473 71.60260  0.000000

49. How to join two dataframes by 2 columns so they have only the common rows?

Difficulty Level: L2 Join dataframes df1 and df2 by ‘fruit-pazham’ and ‘weight-kilo’. Input

DT1 = data.table(fruit =  c('apple', 'banana', 'orange'),
                    weight =  c('high', 'medium', 'low'),
                    price=  c(1,2,3))

DT2 = data.table(pazham =  c('apple', 'orange', 'pine'),
                    kilo= c('high', 'low', 'high'),
                    price =  c(1,2,3))

Desired Output

    fruit weight price_left price_right
1:  apple   high          1           1
2: orange    low          3           2
Show Solution
# Input
DT1 = data.table(fruit =  c('apple', 'banana', 'orange'),
                    weight =  c('high', 'medium', 'low'),
                    price=  c(1,2,3))

DT2 = data.table(pazham =  c('apple', 'orange', 'pine'),
                    kilo= c('high', 'low', 'high'),
                    price =  c(1,2,3))

# Solution
output <- merge(DT1, DT2,
                  by.x = c('fruit', 'weight'),
                  by.y = c('pazham', 'kilo'),
                  all = FALSE,
                  suffixes = c("_left", "_right"))

print(output)
#>     fruit weight price_left price_right
#> 1:  apple   high          1           1
#> 2: orange    low          3           2

‘

50. How to get the positions where values of two columns of data.table match?

Difficulty Level: L2 Question : Get the positions where values of two columns of DT match. Input

DT <- data.table(fruit1 =  c('apple', 'orange', 'banana', 'mango),
                 fruit2 =  c('apple', 'grapes', 'banana', 'jackfruit'))

Desired Output

1 3
Show Solution
# Input
DT <- data.table(fruit1 =  c('apple', 'orange', 'banana', 'mango'),
                    fruit2 =  c('apple', 'grapes', 'banana', 'jackfruit'))

# Solution
which(DT$fruit1 == DT$fruit2)
  1. 1
  2. 3

‘

51. How to create lags and leads of a column in a data.table?

Difficulty Level: L2 Create two new columns in df, one of which is a lag 1 (shift column a down by 1 row) of column ‘a’ and the other is a lead 1 (shift column b up by 1 row). Input

DT <- data.table(V1 = runif(4, 1, 100),
                 V2 = runif(4, 1, 80),
                 V3 = runif(4, 1, 100),
                 V4 = runif(4,1, 50))

Desired Output

         V1       V2        V3       V4 lagged_column lead_column
1: 90.41034 79.62526 57.525005 16.88133            NA    13.19427
2: 13.19427 29.20243  3.962821 35.72731      90.41034    13.79110
3: 13.79110 15.68368 78.933011 18.43108      13.19427    86.76293
4: 86.76293 33.66214  6.706639 43.40251      13.79110          NA
Show Solution
# Input
DT <- data.table(V1= runif(4, 1, 100), V2 =runif(4, 1, 80), V3 = runif(4, 1, 100), V4 = runif(4,1, 50))

# Solution
DT[, lagged_column := shift(V1, type = 'lag')]
DT[, lead_column := shift(V1, type = 'lead')]
print(DT)
#>          V1        V2        V3       V4 lagged_column lead_column
#> 1: 51.50006 74.050716 27.618570 16.68658            NA    82.29783
#> 2: 82.29783 63.969537  9.054432  1.16761      51.50006    78.36425
#> 3: 78.36425 63.937995 85.047398 21.39628      82.29783    63.64181
#> 4: 63.64181  2.482478 10.060054 27.33597      78.36425          NA

52. How to get the frequency of unique values in the entire dataframe?

Difficulty Level: L2 Question : Get the frequency of unique values in the entire dataframe DT. Input

DT <- data.table(fruit =  c('apple', 'orange', 'banana', 'apple'))

Desired Output

    fruit number_of_distinct_orders
1:  apple                         2
2: orange                         1
3: banana                         1
Show Solution
# Input
DT <- data.table(fruit =  c('apple', 'orange', 'banana', 'apple'))

# Solution
output <- DT
output[,flag := 1]
print(output[, .(number_of_distinct_orders = length(flag)), by = fruit])
#>     fruit number_of_distinct_orders
#> 1:  apple                         2
#> 2: orange                         1
#> 3: banana                         1

53. How to convert a table from long to wide format using R data.table?

Question : Create a pivot table out of DT keeping ID & Month as key. Difficulty Level: L2 Input

n <- 5
DT <- data.table(
    ID       = sample(1:20, n, replace=TRUE),
    Month    = sample(1:12, n, replace=TRUE),
    Category = c("Drinks", "Food", "Drinks", "Food", "Food"),
    Expenses = runif(n),
    key      = c('ID', 'Month')
)
#>    ID Month Category  Expenses
#> 1:  4     3   Drinks 0.9921504
#> 2:  4     4     Food 0.8073523
#> 3:  8    10     Food 0.5533336
#> 4: 14     8     Food 0.2588098
#> 5: 20     4   Drinks 0.2012480

Desired Output

   ID Month    Drinks      Food
1:  4     3 0.9921504 0.0000000
2:  4     4 0.0000000 0.8073523
3:  8    10 0.0000000 0.5533336
4: 14     8 0.0000000 0.2588098
5: 20     4 0.2012480 0.0000000
Show Solution
# Input
n <- 5
DT <- data.table(
  ID=sample(1:20, n, replace=TRUE),
  Month=sample(1:12, n, replace=TRUE),
  Category= c("Drinks", "Food", "Drinks", "Food", "Food"),
  Expenses=runif(n),
  key=c('ID', 'Month')
)

# Solution
output <- dcast.data.table(DT, ID + Month ~ Category, fun=sum, value.var='Expenses')
print(output)
#>    ID Month    Drinks       Food
#> 1:  7     6 0.0000000 0.75928350
#> 2:  7    10 0.5103192 0.00000000
#> 3:  9     3 0.1320670 0.00000000
#> 4: 10     2 0.0000000 0.07450386
#> 5: 18     7 0.0000000 0.23840221

54. How to create a bootstrap sample (sample same number of rows with replacement) from a data.table?

Difficulty Level: L2 Question : Create a bootstrap sample of length 5 from DT. Input

DT <- data.table(V1 = runif(20, 1, 100),
                 V2 = runif(20, 1, 80),
                 V3 = runif(20, 1, 100),
                 V4 = runif(20,1, 50))
Show Solution
# Input
DT <- data.table(V1 = runif(20, 1, 100),
                 V2 = runif(20, 1, 80),
                 V3 = runif(20, 1, 100),
                 V4 = runif(20,1, 50))

# Solution
n <- 5
row_number <- sample(1:20, n, replace=TRUE)
print(DT[row_number,])
#>           V1       V2       V3       V4
#> 1:  3.213551 25.49768 30.01245  5.81102
#> 2: 28.313228 63.25563 89.86874 30.28312
#> 3: 37.163717 41.17688 98.72226 43.52485
#> 4: 91.656742 60.68913  9.93234 21.66074
#> 5: 51.661261 26.40149 28.44038 27.73880

55. How to bin a numeric column with user custom intervals to form a categorical (text) column?

Difficulty Level: L2 In DT, create a new column (cat_col, that has 'fail' if the average of the first two columns is less than 40. Else, it contains 'pass'. Input

set.seed(100)
DT <- data.table(V1 = runif(20, 1, 100),
                 V2 = runif(20, 1, 80))

Desired Ouput

           V1       V2 cat_col
 1: 31.468845 43.32908    fail
 2: 26.509578 57.15350    pass
 3: 55.679921 43.52955    pass
 4:  6.581932 60.16881    fail
 5: 47.386379 34.18801    pass
 6: 48.893303 14.54220    fail
(...truncated...)
Show Solution
# Input
set.seed(100)
DT <- data.table(V1= runif(20, 1, 100),
                 V2 =runif(20, 1, 80))

# Solution
DT[, cat_col := ifelse((V1 + V2)/2 < 40, 'fail' , 'pass')]
print(DT)
#>            V1       V2 cat_col
#>  1: 31.468845 43.32908    fail
#>  2: 26.509578 57.15350    pass
#>  3: 55.679921 43.52955    pass
#>  4:  6.581932 60.16881    fail
#>  5: 47.386379 34.18801    pass
#>  6: 48.893303 14.54220    fail
#>  7: 81.427859 61.85383    pass
#>  8: 37.661733 70.67433    pass
#>  9: 55.109301 44.37864    pass
#> 10: 17.855943 22.94018    fail
#> 11: 62.874651 39.57617    pass
#> 12: 88.334386 74.35190    pass
#> 13: 28.755030 28.54667    fail
#> 14: 40.450302 76.37846    pass
#> 15: 76.492557 55.92666    pass
#> 16: 67.233150 71.26683    pass
#> 17: 21.256604 15.25217    fail
#> 18: 36.394960 50.72188    pass
#> 19: 36.588036 79.17557    pass
#> 20: 69.338762 11.29282    pass

56. How to convert a data.table from wide to long format?

Difficulty Level: L2 Question : Convert DT from wide to long format by keeping ID & Month as key. Input

n <- 5
DT <- data.table(
  ID       = sample(1:20, n, replace=TRUE),
  Month    = sample(1:12, n, replace=TRUE),
  Drinks   = sample(10:20,n, replace = TRUE),
  Food     = sample(10:20,n, replace = TRUE),
  Starters = sample(5:15,n, replace = TRUE)
)

   ID Month Drinks Food Starters
1:  1    12     17   14       13
2: 14     2     12   12       11
3: 12     7     12   15       11
4: 19     1     16   15       15
5: 15    11     17   10       10

Desired Output

   ID Month variable value
1: 14     4   Drinks    12
2:  4    11   Drinks    18
3: 19     5   Drinks    17
4: 19     7   Drinks    15
5: 14     4   Drinks    11
6: 14     4     Food    14
(...truncated...)
Show Solution
# Input
n <- 5
DT <- data.table(
  ID=sample(1:20, n, replace=TRUE),
  Month=sample(1:12, n, replace=TRUE),
  Drinks= sample(10:20,n, replace = TRUE),
  Food = sample(10:20,n, replace = TRUE),
  Starters = sample(5:15,n, replace = TRUE)
)

# Solution
output = melt(DT, id.vars = c("ID", "Month"),
                measure.vars = c("Drinks", "Food", "Starters"))
print(head(output))
#>    ID Month variable value
#> 1: 14     4   Drinks    12
#> 2:  4    11   Drinks    18
#> 3: 19     5   Drinks    17
#> 4: 19     7   Drinks    15
#> 5: 14     4   Drinks    11
#> 6: 14     4     Food    14

57. How to create a dataframe that contains the first 3 lags of a time series data?

Difficulty Level: L2 Question : Append a new column in DT with first three lag of column V1. Input

DT <- data.table(Date = seq(as.Date('2011-01-01'),as.Date('2011-01-10'),by = 1),
                 V1   = round(runif(10, 1, 80),2))

Desired Output

         Date    V1  lag1  lag2  lag3
1: 2011-01-01 48.92    NA    NA    NA
2: 2011-01-02 65.45 48.92    NA    NA
3: 2011-01-03 67.63 65.45 48.92    NA
4: 2011-01-04 63.26 67.63 65.45 48.92
5: 2011-01-05  2.50 63.26 67.63 65.45
6: 2011-01-06 56.15  2.50 63.26 67.63
7: 2011-01-07 65.39 56.15  2.50 63.26
8: 2011-01-08 45.90 65.39 56.15  2.50
Show Solution
# Input
DT <- data.table(Date = seq(as.Date('2011-01-01'),as.Date('2011-01-10'),by = 1),
                 V1   = round(runif(10, 1, 80),2))

# Solution
DT[, `:=`(lag1 = shift(V1, 1, type = 'lag'),
          lag2 = shift(V1, 2, type = 'lag'),
          lag3 = shift(V1, 3, type = 'lag'))]

print(head(DT, 8))
#>          Date    V1  lag1  lag2  lag3
#> 1: 2011-01-01  8.05    NA    NA    NA
#> 2: 2011-01-02 13.85  8.05    NA    NA
#> 3: 2011-01-03  3.11 13.85  8.05    NA
#> 4: 2011-01-04 57.06  3.11 13.85  8.05
#> 5: 2011-01-05 61.12 57.06  3.11 13.85
#> 6: 2011-01-06 68.74 61.12 57.06  3.11
#> 7: 2011-01-07 35.54 68.74 61.12 57.06
#> 8: 2011-01-08 33.95 35.54 68.74 61.12

58. How to shuffle rows of a dataframe?

Difficulty Level: L2 Question : Shuffle rows of DT. Input

DT <- data.table(Date = seq(as.Date('2011-01-01'),as.Date('2011-01-10'),by = 1),
                 V1   = runif(10, 1, 80),
                 V2   = runif(10, 1, 100),
                 V3   = runif(10,1, 50))
Show Solution
# Input
DT <- data.table(Date = seq(as.Date('2011-01-01'), as.Date('2011-01-10'),by = 1),
                 V1   = runif(10, 1, 80),
                 V2   = runif(10, 1, 100),
                 V3   = runif(10,1, 50))

# Solution
set.seed(1000)
print(DT[sample(nrow(DT), replace = T),])
#>           Date       V1       V2        V3
#>  1: 2011-01-04 35.76134  2.61564 17.215551
#>  2: 2011-01-06 54.37578 56.66843 15.841530
#>  3: 2011-01-03 59.85359 21.81431 32.227574
#>  4: 2011-01-08 39.23481 74.79349 33.457133
#>  5: 2011-01-03 59.85359 21.81431 32.227574
#>  6: 2011-01-02 54.02029 34.80660  7.503086
#>  7: 2011-01-06 54.37578 56.66843 15.841530
#>  8: 2011-01-06 54.37578 56.66843 15.841530
#>  9: 2011-01-06 54.37578 56.66843 15.841530
#> 10: 2011-01-01 76.45873 27.03600 16.913088

59. How to select rows between two dates in a dataframe?

Difficulty Level: L1 Question : Select all rows between dates 2011-01-05 & 2011-01-08 in DT. Input

set.seed(100)
DT <- data.table(Date = seq(as.Date('2011-01-01'),as.Date('2011-01-10'),by = 1),
                 V1   = runif(10, 1, 80),
                 V2   = runif(10, 1, 100),
                 V3   = runif(10,1, 50))

Desired Output

         Date       V1       V2        V3
1: 2011-01-06 28.39314 36.99609 29.814114
2: 2011-01-07 52.53458 33.46489  5.073762
Show Solution
# Input
DT <- data.table(Date= seq(as.Date('2011-01-01'),as.Date('2011-01-10'),by = 1), V1 =runif(10, 1, 80), V2 = runif(10, 1, 100), V3 = runif(10,1, 50))

# Solution
output <- DT[(Date > '2011-01-05') & (Date < '2011-01-08'),]
print(output)
#>          Date       V1       V2        V3
#> 1: 2011-01-06 28.39314 36.99609 29.814114
#> 2: 2011-01-07 52.53458 33.46489  5.073762

To be continued . . .