Это немного грязно, но вы можете сделать следующее:
library(dplyr)
library(tidyr)
dat <- mtcars %>%
tibble::rownames_to_column(var = "Car1") %>%
mutate(Car2 = Car1) %>%
group_by(am, gear) %>%
expand(Car1, Car2) %>%
left_join(tibble::rownames_to_column(mtcars, var = "Car1"), by = "Car1") %>%
left_join(tibble::rownames_to_column(mtcars, var = "Car2"), by = "Car2") %>%
ungroup() %>%
mutate(result = disp.x > disp.y & hp.x > hp.y) %>%
select(Car1, Car2, result)
Тогда мы получим ожидаемые результаты:
dat
# A tibble: 330 x 3
Car1 Car2 result
<chr> <chr> <lgl>
1 AMC Javelin AMC Javelin FALSE
2 AMC Javelin Cadillac Fleetwood FALSE
3 AMC Javelin Camaro Z28 FALSE
4 AMC Javelin Chrysler Imperial FALSE
5 AMC Javelin Dodge Challenger FALSE
6 AMC Javelin Duster 360 FALSE
7 AMC Javelin Hornet 4 Drive TRUE
8 AMC Javelin Hornet Sportabout FALSE
9 AMC Javelin Lincoln Continental FALSE
10 AMC Javelin Merc 450SE FALSE
# … with 320 more rows
dat %>% filter(Car1 == "Mazda RX4")
# A tibble: 8 x 3
Car1 Car2 result
<chr> <chr> <lgl>
1 Mazda RX4 Datsun 710 TRUE
2 Mazda RX4 Fiat 128 TRUE
3 Mazda RX4 Fiat X1-9 TRUE
4 Mazda RX4 Honda Civic TRUE
5 Mazda RX4 Mazda RX4 FALSE
6 Mazda RX4 Mazda RX4 Wag FALSE
7 Mazda RX4 Toyota Corolla TRUE
8 Mazda RX4 Volvo 142E TRUE
(В то время как сравнение Mazda RX4 с Datsun 710 отличается от заявленных вами ожидаемых результатов, это на самом деле правильно:)
mtcars %>%
tibble::rownames_to_column(var = "Car1") %>%
filter(Car1 %in% c("Mazda RX4", "Datsun 710"))
Car1 mpg cyl disp hp drat wt qsec vs am gear carb
1 Mazda RX4 21.0 6 160 110 3.90 2.62 16.46 0 1 4 4
2 Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1