Split dataframe column in R - r

I have a tibble
a <- tribble(~names,"|david:123|",)
and I've seen code that does the following but, not sure what it does.
a %>% split(.$names)

split splits the dataframe based on values in a column. You have provided one row data which is not helpful to demonstrate what it does. Let's consider the inbuilt mtcars dataset.
The unique values in cyl column of mtcars dataset are 6, 4, 8.
unique(mtcars$cyl)
#[1] 6 4 8
When we use mtcars %>% split(.$cyl) it divides mtcars dataset into list of length 3 where each list consists of one unique cyl value.
temp <- mtcars %>% split(.$cyl)
temp[[1]]
# mpg cyl disp hp drat wt qsec vs am gear carb
#Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#...
temp[[2]]
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#...
temp[[3]]
# mpg cyl disp hp drat wt qsec vs am gear carb
#Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
#Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
#Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
#Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
#...
As we can see that mtcars[[1]] has all the rows where cyl = 4, mtcars[[2]] has rows where cyl = 6, mtcars[[3]] has all cyl = 8.
Similarly, for your case, a %>% split(.$names) splits dataframe/tibble into list of unique names from the data. .$names is to extract the names column from a dataframe.

Related

Passing a quoted function argument to a three-dots argument inside another function using base R

I would like to pass quoted variables in the group argument of geom_col_wrap to the split_group function.
# I deleted the rest of the function for readability
geom_col_wrap = function(data, mapping, group, ...) {
data |>
split_group(group)
}
# This function was based on the `tidytable` package
split_group = function(data, ...) {
by_quote = as.list(substitute(...()))
by = sapply(by_quote, deparse)
split = vctrs::vec_split(data, data[c(by)])
out = split[["val"]]
names = do.call(paste, c(split[["key"]], sep = "_"))
names(out) = names
return(out)
}
split_group use substitute to quote variables, here is the problem. How can I make split_group recognize quote variables from group argument? I know it is easy to solve using rlang, but I need a R base solution.
split_group(mtcars, vs, am)
$`0_1`
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
...
$`1_1`
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
...
$`1_0`
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
...
$`0_0`
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
...
geom_col_wrap(
mtcars,
mapping = ggplot2::aes(x = cyl, y = hp, color = am),
group = c(vs, am)
)
Error in `[.data.frame`(data, c(by)) : undefined columns selected
This error comes from as.list(substitute(...())). It does not unquoted the group argument. Why?
Note: I cannot use dots arg to solve the problem.
Using the miraculous ...() chain, explanation is given here.
split_group <- \(x, ...) split(x, x[, sapply(substitute(...()), as.character)])
split_group(mtcars, vs, am)
# $`0.0`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet Sportabout 18.7 8 360.0 175 3.15 3.44 17.02 0 0 3 2
# Duster 360 14.3 8 360.0 245 3.21 3.57 15.84 0 0 3 4
# Merc 450SE 16.4 8 275.8 180 3.07 4.07 17.40 0 0 3 3
# ...
#
# $`1.0`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
# Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# ...
#
# $`0.1`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Porsche 914-2 26 4 120.3 91 4.43 2.140 16.70 0 1 5 2
# ...
#
# $`1.1`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
You basically need the base R version of rlang's {{ group }} or !!enquo(group) workflow. Which would be using substitute() to grab your group argument, and then using .(group) inside bquote().
However bquote() helps you build the expression, we then need to use eval() to evaluate your new expression.
Another thing - you're using deparse() in split_group() which would convert c(vs, am) to "c(vs, am)". Instead we'll need to mimic tidyselect so you can use c() style selection (that also still works without c() for a single column).
Put together it looks like this.
split_group = function(data, ...) {
by_quote = as.list(substitute(...()))
# Mimic tidyselect
cols = as.list(seq_along(data))
names(cols) = names(data)
by = unlist(lapply(by_quote, eval, cols))
split = vctrs::vec_split(data, data[c(by)])
out = split[["val"]]
names = do.call(paste, c(split[["key"]], sep = "_"))
names(out) = names
return(out)
}
geom_col_wrap = function(data, mapping, group, ...) {
# Use substitute/bquote to "unquote" group arg inside split_group function
# Much like using `{{ group }}` or `!!enquo(group)` in rlang
group = substitute(group)
eval(bquote(
data |>
split_group(.(group))
))
}
geom_col_wrap(
mtcars,
mapping = ggplot2::aes(x = cyl, y = hp, color = am),
group = c(vs, am)
)
#> $`0_1`
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#> Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#> Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#> Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
#> Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
#> Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
#>
#> $`1_1`
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#> Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#> Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#> Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#> Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#> Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
#>
#> $`1_0`
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#> Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#> Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#> Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#> Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
#> Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
#> Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
#>
#> $`0_0`
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#> Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#> Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
#> Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
#> Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
#> Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
#> Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
#> Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
#> Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
#> AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
#> Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
#> Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Any reason you can't use rlang? vctrs depends on rlang so you're already sort of using it anyway.

Correct way to mutate with case_when while using a loop

I found somewhat similar examples here and here, but I didn't follow the examples for the problem I am trying to solve.
What I would like to do is to use mutate and case_when to create a new column. The new column would create a category classification (e.g., "category_1") depending on the values from a different column. Since the number of values may change I want to make the case_when dynamic.
The problem is when this loop operates, it operates fine on each iteration, but when the loop advances it overwrites the previous values. So I am wondering how to use a case_when in a loop that would prevent the last loop value being evaluated while overwriting the previous iterations.
Here is a reproducible example:
library(tidyverse)
# Use built-in data frame for reproducible example
my_df <- mtcars
# Create sequence to reference beginning and end ranges within mpg values
mpg_vals <- sort(mtcars$mpg)
beg_seq <- seq(1, 31, 4)
end_seq <- seq(4, 32, 4)
# Create loop to fill in mpg category
for(i in 1:8){
my_df <- my_df %>%
mutate(mpg_class = case_when(
mpg %in% mpg_vals[beg_seq[i]:end_seq[i]] ~ paste0("category", i)
)
)
# Observe loop values
print(mpg_vals[beg_seq[i]:end_seq[i]])
print(paste0("category_", i))
}
Edit:
If I understand the questions right, you want every fourth ranking of mpg to get a new category. You might use:
my_df %>%
mutate(mpg_class = paste("category", 1 + min_rank(mpg) %/% 4))
That produces:
mpg cyl disp hp drat wt qsec vs am gear carb mpg_class
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 category 5
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 category 5
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 category 7
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 category 6
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 category 4
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 category 4
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 category 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 category 7
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 category 7
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 category 5
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 category 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 category 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 category 4
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 category 2
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 category 1
...
Original answer: A looped case_when seems complicated when you could do:
lengths <- end_seq - beg_seq + 1
my_df$mpg_class <- rep(paste0("category", 1:length(lengths)), lengths)
This finds the length of each category. Then we make a vector that repeats each category name as many times as the length of the category and assign that to an mpg_class column.

how to filter a set of rownames that have a certain sequence of characters, using dplyr in R?

I have it:
mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Output:
> mtcars %>% filter(rownames(mtcars) %in% "^M")
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 linhas> (ou row.names de comprimento 0)
expected output:
mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
I only found solutions when the column is string.
In this case, the search must be performed on rownames.
If you want to check if a string contains a regex pattern you have to use grepl instead of %in%:
mtcars %>% filter(grepl("^M", rownames(mtcars)))
Equivalently, you can use stringr::str_detect instead of grepl.
mtcars %>% filter(stringr::str_detect(rownames(mtcars), "^M"))

Combine a list of data frames column wise and return a list of combined data frames using R

I would like to combine two list of data frames element wise and return a list of data frames. The following code works for the mtcars dataset
list1=split(mtcars[c(1:16),-11],mtcars[c(1:16),2])
list2=split(data.frame(mtcars[c(1:16),]),mtcars[c(1:16),2])
newList=Map(cbind, list1, list2)
How do I modify the Map function to just bind a specific column(s) from list2? Thanks
Since #thelatemail doesn't want to add an answer here is purrr version of his answer.
library(purrr)
map2(list1, map(list2, `[`, 'carb'), cbind)
#Or
#map2(list1, map(list2, `[`, 'carb'), dplyr::bind_cols)
#$`4`
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 22.8 4 108.0 93 3.85 2.32 18.61 1 1 4 1
#2 24.4 4 146.7 62 3.69 3.19 20.00 1 0 4 2
#3 22.8 4 140.8 95 3.92 3.15 22.90 1 0 4 2
#$`6`
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#3 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#4 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
#5 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
#6 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
#$`8`
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#2 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
#3 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
#4 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
#5 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
#6 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
#7 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4

R - Partially flatten nested lists with dataframes

I have a list with this structure:
$ List (length 13) ; 13 Types
$ --- Lists (Length 4) ; Each have 4 subsets of the same original data
$ ------- Dataframes 1, 2, 3, and 4 ; for each of 13 types
I want
$ List (length 52) ; 52 Versions (Type_Subset)
$ --- Dataframes 1, 2, 3, ... 52 ; As separate elements in list
How would I do this using the below mtcars example?
df <- list(Blue = list(mtcars[1:3,], mtcars[4:6,], mtcars[7:9,]),
Red = list(mtcars[10:12,], mtcars[13:15,], mtcars[16:18,]),
Green = list(mtcars[18:20,], mtcars[21:23,], mtcars[24:26,]))
# Need function on df ...
# new_df <- SingleNestLevel(df)
# Which yields:
list(Blue1 = mtcars[1:3,],
Blue2 = mtcars[4:6,],
Blue3 = mtcars[7:9,],
Red1 = mtcars[10:12,],
Red2 = mtcars[13:15,],
Red3 = mtcars[16:18,],
Green1 = mtcars[18:20,],
Green2 = mtcars[21:23,],
Green3 = mtcars[24:26,])
Note: I have looked at analogous questions like this one, but I want to convert to one nested level, not flatten my structure entirely.
just use:
unlist(your_list,recursive=F)
I think this generalizes your issue to any nested list:
library(purrr)
new_df <- flatten(df) %>%
setNames(paste0(rep(names(df), times = map_int(df, ~length(.x))),
unlist(map(df, ~1:length(.x)))))
Using the same library data.table you can try
library(data.table)
df <- copy(mtcars[1:27,]) # copying reserved dataset mtcars.
setDT(df, keep.rownames = TRUE)[,v1 :=rep(unlist(lapply(c("Blue","Red", "Green"),paste, 1:3, sep = "")),
each = 3)] #including temporary variable v1
df <- split(df, df$v1) #spliting into a list
df <- lapply(df, function(x) x[,v1 := NULL]) #removing temporary variable nv1
df #Returns
$Blue1
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2: Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3: Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
$Blue2
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
2: Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
3: Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
$Blue3
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Duster 360 14.3 8 360.0 245 3.21 3.57 15.84 0 0 3 4
2: Merc 240D 24.4 4 146.7 62 3.69 3.19 20.00 1 0 4 2
3: Merc 230 22.8 4 140.8 95 3.92 3.15 22.90 1 0 4 2
$Green1
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
2: Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
3: Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
$Green2
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Dodge Challenger 15.5 8 318 150 2.76 3.520 16.87 0 0 3 2
2: AMC Javelin 15.2 8 304 150 3.15 3.435 17.30 0 0 3 2
3: Camaro Z28 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
$Green3
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
2: Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
3: Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
$Red1
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Merc 280 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4
2: Merc 280C 17.8 6 167.6 123 3.92 3.44 18.9 1 0 4 4
3: Merc 450SE 16.4 8 275.8 180 3.07 4.07 17.4 0 0 3 3
$Red2
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Merc 450SL 17.3 8 275.8 180 3.07 3.73 17.60 0 0 3 3
2: Merc 450SLC 15.2 8 275.8 180 3.07 3.78 18.00 0 0 3 3
3: Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.25 17.98 0 0 3 4
$Red3
rn mpg cyl disp hp drat wt qsec vs am gear carb
1: Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
2: Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
3: Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1

Resources