impropio - subconjunto propio
Usando múltiples criterios en función de subconjunto y operadores lógicos (2)
El operador correcto es %in%
aquí. Aquí hay un ejemplo con datos ficticios:
set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
foo = runif(10))
dando:
> head(dat)
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
4 4 0.3841037
5 1 0.7698414
6 4 0.4976992
El subconjunto de dat
donde bf11
es igual a cualquiera del conjunto 1,2,3
se toma de la siguiente manera usando %in%
:
> subset(dat, subset = bf11 %in% c(1,2,3))
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
5 1 0.7698414
8 3 0.9919061
9 3 0.3800352
10 1 0.7774452
En cuanto a por qué su original no funcionó, analícelo para ver el problema. Mira lo que 1||2||3
evalúa a:
> 1 || 2 || 3
[1] TRUE
y obtendrías lo mismo usando |
en lugar. Como resultado, la llamada a subset()
solo devolvería filas donde bf11
era TRUE
(o algo que se evaluó como TRUE
).
Lo que podrías haber escrito hubiera sido algo como:
subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
Lo que da el mismo resultado que mi anterior llamada subset()
. El punto es que necesita una serie de comparaciones individuales, no una comparación de una serie de opciones. Pero como puede ver, %in%
es mucho más útil y menos detallado en tales circunstancias. Tenga en cuenta también que tengo que usar |
ya que quiero comparar cada elemento de bf11
contra 1
, 2
y 3
, a su vez. Comparar:
> with(dat, bf11 == 1 || bf11 == 2)
[1] TRUE
> with(dat, bf11 == 1 | bf11 == 2)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
Si quiero seleccionar un subconjunto de datos en R, puedo usar la función de subconjunto. Quería basar un análisis en datos que coincidían con uno de los pocos criterios, por ejemplo, que una determinada variable era 1, 2 o 3. Lo intenté
myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))
Siempre seleccionó valores que coincidían con el primero de los criterios, aquí 1. Supongo que comenzaría con 1 y si se evalúa como "falso" pasaría a 2 y luego a 3, y si ninguno coincide la declaración después de == es "falsa" y si una de ellas coincide, es "verdadera".
Obtuve el resultado correcto usando
newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))
Pero me gustaría poder seleccionar datos a través de operadores lógicos, entonces: ¿por qué no funcionó el primer enfoque?
Para su ejemplo, creo que lo siguiente debería funcionar:
myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
Vea los ejemplos en el ?subset
para más. Solo para demostrarlo, un subconjunto lógico más complicado sería:
data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)
Y como señala Chase, %in%
sería más eficiente en tu ejemplo:
myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))
Como también lo señala Chase, asegúrese de entender la diferencia entre |
y ||
. Para ver las páginas de ayuda para operadores, use ?''||''
, donde se cita al operador.