Inspirado por esta pregunta estoy tratando de simplificar una llamada which para evitar llamar al marco de datos, aquí { {X1}}, y la variable a la que estoy condicionando, aquí cyl, más de una vez.

Di que este es mi código,

mtcars[with(mtcars, which(cyl == gear | cyl == carb)), ]

Aquí estoy llamando al marco de datos dos veces y la variable cyl también se llama dos veces. Me imagino que hay una manera simple de escribir algo en la línea de cyl %in% c(carb, gear) o algo así.

La idea principal es que estoy buscando una manera de indicar solo mtcars, cyl, gear y carb una vez en mi llamada.

Me doy cuenta de que esto es bastante simple, pero es solo para ilustrar el problema. Eche un vistazo a la pregunta vinculada anteriormente si desea estudiar un ejemplo más elaborado.

1
Eric Fail 19 ene. 2018 a las 13:58

3 respuestas

La mejor respuesta

Con dplyr:

library(dplyr)
mtcars %>% mutate(rownames = rownames(.)) %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb       rownames
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   Ferrari Dino
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8  Maserati Bora
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E

Si no necesita los nombres de fila:

mtcars %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Pero no creo que haya una manera de simplificar (cyl == gear | cyl == carb), por lo que solo llama a cyl una vez.

2
brettljausn 19 ene. 2018 a las 11:19

Considere la base R apilando cada filtro con do.call(rbind, ...):

do.call(rbind, lapply(c("gear", "carb"), function(s) subset(mtcars, cyl == mtcars[s])))

#                 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
# 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
# Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# 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
Parfait 19 ene. 2018 a las 17:15

Mira data.table:

require(data.table)
as.data.table(mtcars, keep.rownames = T)[cyl == gear | cyl == carb,]
#                 rn  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#  1:     Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#  2:      Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#  3:       Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#  4:       Fiat 128 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#  5:    Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#  6: Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#  7:      Fiat X1-9 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#  8:   Ferrari Dino 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#  9:  Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# 10:     Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
1
minem 19 ene. 2018 a las 11:08
48339561