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.
3 respuestas
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.
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
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
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.