[R-es] Sumar positivos y negativos por separado

Proyecto R-UCA r-uc@ @end|ng |rom uc@@e@
Lun Ene 2 22:17:20 CET 2023


Hola,

He usado el data.frame Chile, pero puedes usar cualquier otro.

De las sumas se han omitido los NA, de lo contrario la suma siempre saldría NA. Además para las columnas no numéricas el resultado es NA.

library(carData)
data(Chile)

sump <- function(x) {
    if (is.numeric(x)) {
        sum(x[x > 0], na.rm = TRUE) }
    else {
            NA
        }
}

sumn <- function(x) {
    if (is.numeric(x)) {
        sum(x[x < 0], na.rm = TRUE)
    } else {
        NA
    }
}

sapply(Chile, FUN = sump)

sapply(Chile, FUN = sumn)

> sapply(Chile, FUN = sump)
      region   population          sex          age    education       income 
          NA 4.110000e+08           NA 1.040430e+05           NA 8.814500e+07 
   statusquo         vote 
1.203598e+03           NA 
> sapply(Chile, FUN = sumn)
    region population        sex        age  education     income  statusquo 
        NA      0.000         NA      0.000         NA      0.000  -1203.598 
      vote 
        NA 

Si no te importa que salga un aviso entonces las definiciones de sumn y sump se pueden simplificar como sigue:


sump <- function(x) {
   sum(x[x > 0], na.rm = TRUE) }
}

sumn <- function(x) {
   sum(x[x < 0], na.rm = TRUE)
}

Un saludo.

El lun, 02-01-2023 a las 11:23 +0100, Manuel Mendoza escribió:
> Gracias Emilio y Proyecto R-UCA, no consigo implementar ninguna de vuestras propuestas.
> En la de Emilio sale bien hasta las funciones, incluidas, pero no entiendo a partir de: d |>
> y me da error.
> 
> Respecto a sum(x[x>0]), lamento deciros que  tampoco  lo entiendo ni consigo implementarlo
> 
> ¿Podríais darme más detalles?
> 
> Gracias,
> Manuel
> 
> 
> El lun, 2 ene 2023 a las 10:23, Proyecto R-UCA (<r-uca using uca.es>) escribió:
> > Buenas,
> > 
> > Sin usar dplyr,
> > 
> > Se puede hacer un bucle en las columnas y para cada columna
> > 
> > sum(x[x>0])
> > 
> > sum(x[x < 0])
> > 
> > Un saludo.
> > 
> > El lun, 02-01-2023 a las 09:02 +0100, Emilio L. Cano escribió:
> > > Hola,
> > > 
> > > Este sería un ejemplo reproducible rápido. A mí para esto me gusta rowise() de {dplyr}. En c_across() se pueden seleccionar las
> > > columnas a
> > > conveniencia. Seguramente haya una forma de evitar crear las funciones. Si la suma la quieres en valor absoluto multiplicas por -1 en
> > > suma_neg y listo.
> > > 
> > > Un saludo,
> > > Emilio
> > > 
> > > 
> > > > set.seed(2023)
> > > > d <- data.frame(a = round(rnorm(10), 1),
> > > +                 b = round(rnorm(10), 1),
> > > +                 c = round(rnorm(10), 1))
> > > > d
> > >       a    b    c
> > > 1  -0.1  0.3 -0.4
> > > 2  -1.0 -0.4 -0.3
> > > 3  -1.9  0.6  1.2
> > > 4  -0.2  0.7  0.2
> > > 5  -0.6 -0.6 -0.4
> > > 6   1.1  0.7 -1.8
> > > 7  -0.9  0.6 -0.6
> > > 8   1.0  0.5 -0.9
> > > 9  -0.4  0.9  1.5
> > > 10 -0.5  0.6  2.7
> > > > 
> > > > library(dplyr)
> > > > 
> > > > suma_pos <- function(x){
> > > +   sum((x>0)*x)
> > > + }
> > > > suma_neg <- function(x){
> > > +   sum((x<0)*x)
> > > + }
> > > > 
> > > > d |> 
> > > +   rowwise() |> 
> > > +   mutate(positivos = suma_pos(c_across()),
> > > +          negativos = suma_neg(c_across()))
> > > # A tibble: 10 × 5
> > > # Rowwise: 
> > >        a     b     c positivos negativos
> > >    <dbl> <dbl> <dbl>     <dbl>     <dbl>
> > >  1  -0.1   0.3  -0.4       0.3      -0.5
> > >  2  -1    -0.4  -0.3       0        -1.7
> > >  3  -1.9   0.6   1.2       1.8      -1.9
> > >  4  -0.2   0.7   0.2       0.9      -0.2
> > >  5  -0.6  -0.6  -0.4       0        -1.6
> > >  6   1.1   0.7  -1.8       1.8      -1.8
> > >  7  -0.9   0.6  -0.6       0.6      -1.5
> > >  8   1     0.5  -0.9       1.5      -0.9
> > >  9  -0.4   0.9   1.5       2.4      -0.4
> > > 10  -0.5   0.6   2.7       3.3      -0.5
> > > 
> > > 
> > > 
> > > > El 2 ene 2023, a las 6:31, Manuel Mendoza <mmendoza using fulbrightmail.org> escribió:
> > > > 
> > > > Buenos días, de un conjunto de variables, quiero obtener la suma de los
> > > > valores positivos de cada fila, por una parte, y la de los negativos por
> > > > otra. Qué variables toman valores positivos y negativos varía de una fila a
> > > > otra, claro.
> > > > Gracias por vuestra ayuda,
> > > > Manuel
> > > > 
> > > >         [[alternative HTML version deleted]]
> > > > 
> > > > _______________________________________________
> > > > R-help-es mailing list
> > > > R-help-es using r-project.org
> > > > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help-es__;!!D9dNQwwGXtA!XPbjkJgKEEP5dmap64bNfzfAmIe4ArK_nN4H9-QIBPAihE4aO-RS6q6YAaM3IT-sP9qA0PqeGoqQF7gIlec$
> > > >  
> > > 
> > > 
> > >         [[alternative HTML version deleted]]
> > > 
> > > _______________________________________________
> > > R-help-es mailing list
> > > R-help-es using r-project.org
> > > https://urldefense.com/v3/__https://stat.ethz.ch/mailman/listinfo/r-help-es__;!!D9dNQwwGXtA!XPbjkJgKEEP5dmap64bNfzfAmIe4ArK_nN4H9-QIBPAihE4aO-RS6q6YAaM3IT-sP9qA0PqeGoqQF7gIlec$
> > >  
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es using r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es