Al analizar la familia de funciones de aplicación, sapply no produce lo que me gustaría. El problema lo simplifiqué a un ejemplo básico a continuación. Creo un vector y luego realizo una operación de suma.

1.
v<-c(1:9)
sum(v)
#this returns 45 as expected

2.
sapply (v, sum)
#this returns [1] 1 2 3 4 5 6 7 8 9

¿Cómo debo usar sapply () para sumar el vector de arriba? Muchas gracias.

r
0
Tamas 10 may. 2019 a las 00:25

3 respuestas

La mejor respuesta

sapply aplica una función a cada elemento de una lista. Entonces, lo que está haciendo aquí es aplicar sum a cada número por sí solo, lo que no logra nada. Puedes ver lo que sucede en este ejemplo:

sapply(1:9, function(x) x + 1)
[1]  2  3  4  5  6  7  8  9 10

Usar sum con apply solo tiene sentido si desea sumar varios elementos de una lista:

sapply(list(1:9, 3:4), sum)
[1] 45  7

Aquí, sum se aplica a cada vector en la lista

3
divibisan 9 may. 2019 a las 21:55

Utilizarías la reducción funcional en este caso

    v<-c(1:9)
    sum(v)
    #this returns 45 as expected

    purrr::reduce(v,sum)
    #this also returns 45

    # or base R
    Reduce(sum,v)
    # this also returns 45
0
Bruce Schardt 9 may. 2019 a las 22:26

Si debe usar sapply, intente,

sapply (list(v), sum)
[1] 45

La función sapply aplica la función sum a cada elemento. Entonces, para el vector v, resumía cada elemento individual.

Está claro que la suma de un elemento, es ese elemento.

Usando la función list, aplicamos la función sum al primer elemento de la lista, que es v, dando el resultado deseado.

Solo para comprender, podemos usar cualquier función para mover el vector "hacia abajo un nivel", como data.frame,

> sapply(data.frame(v), sum)[[1]]
[1] 45

Pero en su caso, no hay necesidad de sapply.

2
Hector Haffenden 9 may. 2019 a las 21:58