subconjuntos subconjunto propio impropio entre ejemplos diferencia r statistics subset logical-operators operator-precedence

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.