Foro de debate

Diferencia entre corchetes y parentésis

 
Picture of Leandro Salerno
Diferencia entre corchetes y parentésis
by Leandro Salerno - Wednesday, 31 October 2018, 11:12 PM
 

Buenas tardes. Les hago la siguiente consulta, supongamos que tengo un objeto llamado x, el cual contiene un vector con 11 números (del 0 al 10). Que diferencia habría de hacer lo siguiente

sum(x[x<5])

sum(x*(x<5))

En el primer caso debería de sumar todos los valores inferiores al 5 e imprimirlos por pantalla.

Y en el segundo caso no debería de multiplicar todos los valores de x que se encuentren entre el 0 y el 10, para luego imprimirlos por pantalla??

Gracias!!

Picture of Manuel Muñoz Márquez
Re: Diferencia entre corchetes y parentésis
by Manuel Muñoz Márquez - Thursday, 1 November 2018, 7:29 AM
 

Hola Leandro:

En este caso ambas expresiones dan exactamente lo mismo. Veamos

> set.seed(1)
> x <- runif(5,max=10)
> sum(x)
[1] 23.20376
> sum(x[x<5])
[1] 8.393145
> sum(x*(x<5))
[1] 8.393145

El resultado de evaluar x < 5 es un vector de valores lógicos TRUE o FASE según el correspondiente elemento sea o no menor que 5

> x<5
[1]  TRUE  TRUE FALSE FALSE  TRUE

Cuando se utiliza un vector lógico como subíndice de un vector obtenemos los valores correspondientes a las posiciones TRUE

> x[x<5]
[1] 2.655087 3.721239 2.016819

En este caso es un vector con tres elementos, que son los que se están sumando.

La operación * aplicada  a dos vectores en R calcula un vector cuyos elementos son el producto de los elementos correspondientes de los vectores, si uno de los vectores es lógico, TRUE equivale al valor 1 y FALSE  a 0, por tanto en este caso se obtiene un vector de 5 elementos, dos de los cuales son 0, y se suma.

> x*(x<5)
[1] 2.655087 3.721239 0.000000 0.000000 2.016819

En esta operación se hacen 5 productos y 4 sumas, en la anterior se hicieron 3 sumas, si bien en el primer caso habría que sumar el tiempo necesario para el acceso selectivo a los elementos del vector. Sospecho que la primera forma es más rápida.

Un saludo.