Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Proyecto R-UCA
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  ageeducation   income 
  NA 4.11e+08   NA 1.040430e+05   NA 8.814500e+07 
   statusquo vote 
1.203598e+03   NA 
> sapply(Chile, FUN = sumn)
region populationsexage  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 () 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
> > >        
> > >  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  
> > > > 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@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@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@r-project.o

Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Manuel Mendoza
Gracias Carlos, y aprovecho para felicitaros también el año nuevo..
Manuel

El lun, 2 ene 2023 a las 13:03, Carlos Ortega ()
escribió:

> Hola,
>
> Feliz Año!.
> Por no dejar pasar la oportunidad de usar algo más vectorizado... y
> rapidito...
> Incluyo tiempos comprativos.
>
> #-
> > library(mlbench)
> > library(data.table)
> > library(dplyr)
> > library(tictoc)
> >
> > data(Ionosphere)
> > head(Ionosphere)
>   V1 V2  V3   V4   V5   V6   V7   V8  V9
>  V10 V11  V12 V13  V14
> 1  1  0 0.99539 -0.05889  0.85243  0.02306  0.83398 -0.37708 1.0
>  0.03760 0.85243 -0.17755 0.59755 -0.44945
> 2  1  0 1.0 -0.18829  0.93035 -0.36156 -0.10868 -0.93597 1.0
> -0.04549 0.50874 -0.67743 0.34432 -0.69707
> 3  1  0 1.0 -0.03365  1.0  0.00485  1.0 -0.12062 0.88965
>  0.01198 0.73082  0.05346 0.85443  0.00827
> 4  1  0 1.0 -0.45161  1.0  1.0  0.71216 -1.0 0.0
>  0.0 0.0  0.0 0.0  0.0
> 5  1  0 1.0 -0.02401  0.94140  0.06531  0.92106 -0.23255 0.77152
> -0.16399 0.52798 -0.20275 0.56409 -0.00712
> 6  1  0 0.02337 -0.00592 -0.09924 -0.11949 -0.00763 -0.11824 0.14706
>  0.06637 0.03786 -0.06302 0.0  0.0
>V15  V16  V17  V18  V19  V20  V21  V22
>  V23  V24  V25  V26
> 1  0.60536 -0.38223  0.84356 -0.38542  0.58212 -0.32192  0.56971 -0.29674
>  0.36946 -0.47357  0.56811 -0.51171
> 2 -0.51685 -0.97515  0.05499 -0.62237  0.33109 -1.0 -0.13151 -0.45300
> -0.18056 -0.35734 -0.20332 -0.26569
> 3  0.54591  0.00299  0.83775 -0.13644  0.75535 -0.08540  0.70887 -0.27502
>  0.43385 -0.12062  0.57528 -0.40220
> 4 -1.0  0.14516  0.54094 -0.39330 -1.0 -0.54467 -0.69975  1.0
>  0.0  0.0  1.0  0.90695
> 5  0.34395 -0.27457  0.52940 -0.21780  0.45107 -0.17813  0.05982 -0.35575
>  0.02309 -0.52879  0.03286 -0.65158
> 6 -0.04572 -0.15540 -0.00343 -0.10196 -0.11575 -0.05414  0.01838  0.03669
>  0.01519  0.00888  0.03513 -0.01535
>V27  V28  V29  V30  V31  V32  V33  V34
> Class
> 1  0.41078 -0.46168  0.21266 -0.34090  0.42267 -0.54487  0.18641 -0.45300
>  good
> 2 -0.20468 -0.18401 -0.19040 -0.11593 -0.16626 -0.06288 -0.13738 -0.02447
>   bad
> 3  0.58984 -0.22145  0.43100 -0.17365  0.60436 -0.24180  0.56045 -0.38238
>  good
> 4  0.51613  1.0  1.0 -0.20099  0.25682  1.0 -0.32382  1.0
>   bad
> 5  0.13290 -0.53206  0.02431 -0.62197 -0.05707 -0.59573 -0.04608 -0.65697
>  good
> 6 -0.03240  0.09223 -0.07859  0.00732  0.0  0.0 -0.00039  0.12011
>   bad
> >
> > data <- Ionosphere %>% select(where(is.numeric)) %>% as.data.frame()
> >
> *> #-- Vectorizado*
> > tic()
> > myfun <- function(x) {
> +
> +   pos <- sum(x[x > 0])
> +   neg <- sum(x[x < 0])
> +
> +   return(list(pos = pos, neg = neg))
> + }
> >
> > resout <- apply(data, 1, myfun)
> > resend <- rbindlist(resout)
> > toc()
> *0.012 sec elapsed*
> > head(resend)
> pos  neg
>   
> 1:  9.96328 -5.23501
> 2:  4.16949 -8.80629
> 3: 11.59911 -2.19323
> 4: 12.07816 -5.61414
> 5:  6.38876 -5.34692
> 6:  0.60859 -1.01667
> >
> >
> *> # Bucle*
> > tic()
> > pos <-c(rep(0, nrow(data)))
> > neg <- c(rep(0, nrow(data)))
> >
> > for (i in 1:nrow(data)) {
> +   x<-data[i,]
> +   pos[i]<-sum(x[x>0])
> +   neg[i]<-sum(x[x<0])
> + }
> > toc()
> *0.609 sec elapsed*
> > head(pos)
> [1]  9.96328  4.16949 11.59911 12.07816  6.38876  0.60859
> > head(neg)
> [1] -5.23501 -8.80629 -2.19323 -5.61414 -5.34692 -1.01667
>
>
> #-
>
>
>
> Gracias,
> Carlos Ortega
> www.qualityexcellence.es
>
>
>
> El lun, 2 ene 2023 a las 11:58, Manuel Mendoza (<
> mmend...@fulbrightmail.org>) escribió:
>
>> Bueno, funcionó con:
>>
>> pos<-c(0)
>> for (i in 1:nrow(data)) {
>> x<-data[i,]
>> pos[i]<-sum(x[x>0])
>> }
>>
>> y x<0 para los negativos
>>
>> Gracias nuevamente,
>> Manuel
>>
>>
>> El lun, 2 ene 2023 a las 10:23, Proyecto R-UCA () 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
>> > >   abc
>> > > 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
>> > > 

Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Manuel Mendoza
Bueno, funcionó con:

pos<-c(0)
for (i in 1:nrow(data)) {
x<-data[i,]
pos[i]<-sum(x[x>0])
}

y x<0 para los negativos

Gracias nuevamente,
Manuel


El lun, 2 ene 2023 a las 10:23, Proyecto R-UCA () 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
> >   abc
> > 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
> >
> >  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 
> 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@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@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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>

[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Emilio L. Cano
Tendrías que ser más específico con lo del error para poderte ayudar.

Para entender mi ejemplo tendrías que estar familiarizado con el pipe ( |> 
nativo que yo uso, o %>% que es equivalente) y con el “tidyverse”. Para el caso 
concreto de las operaciones por columnas te recomiendo que leas este artículo: 
https://dplyr.tidyverse.org/articles/rowwise.html

Saludos,
Emilio

PS: La solución sum(x[x>0]) serviría pero haciendo el bucle por FILAS, que es 
lo que quieres, y guardándolo en algún vector.



> El 2 ene 2023, a las 11:23, 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 () 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
>>>  abc
>>> 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
>>>   
>>> 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 
>> 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@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@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@r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>> 
> 
>   [[alternative HTML version deleted]]
> 
> ___
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es


[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Manuel Mendoza
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 () 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
> >   abc
> > 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
> >
> >  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 
> 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@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@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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>

[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Proyecto R-UCA
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
>        
>  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  
> > 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@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@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@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


Re: [R-es] Sumar positivos y negativos por separado

2023-01-02 Por tema Emilio L. Cano
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
  abc
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
   
 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  
> 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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es


[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


[R-es] Sumar positivos y negativos por separado

2023-01-01 Por tema Manuel Mendoza
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@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es