David Camilo Gomez Medina
2023-Mar-14 19:45 UTC
[R-es] Resultado operación entre dataframes
Buen día estimados, Tengo el siguiente código: df_1 <- data.frame(ana = c(15, 20, 30), maria = c(15,20,30), jose = c(15, 20, 30)) df_2 <- data.frame(nombre = c("jose", "ana", "maria"), valor = c(1,2,3)) # Find the corresponding columns in df_1 based on the values in df_2$nombre cols <- match(df_2$nombre, names(df_1)) # Subtract the values of df_2$valor from the corresponding columns of df_1 df_1[,cols] <- df_1[,cols] - (df_2$valor) # Print the resulting data frame df_1 y mi resultado es el siguiente: ana maria jose 1 14 14 14 2 18 18 18 3 27 27 27 Pero el resultado debería ser: ana maria jose 1 13 12 14 2 18 17 19 3 28 27 29 ¿Saben qué podría estar pasando? Quedo muy atento, gracias. -- *Aviso legal:* El contenido de este mensaje y los archivos adjuntos son confidenciales y de uso exclusivo de la Universidad Nacional de Colombia. Se encuentran dirigidos sólo para el uso del destinatario al cual van enviados. La reproducción, lectura y/o copia se encuentran prohibidas a cualquier persona diferente a este y puede ser ilegal. Si usted lo ha recibido por error, infórmenos y elimínelo de su correo. Los Datos Personales serán tratados conforme a la Ley 1581 de 2012 y a nuestra Política de Datos Personales que podrá consultar en la página web www.unal.edu.co <http://www.unal.edu.co/>.* *Las opiniones, informaciones, conclusiones y cualquier otro tipo de dato contenido en este correo electrónico, no relacionados con la actividad de la Universidad Nacional de Colombia, se entenderá como personales y de ninguna manera son avaladas por la Universidad. [[alternative HTML version deleted]]
Marcelino de la Cruz Rot
2023-Mar-15 08:41 UTC
[R-es] Resultado operación entre dataframes
Buenos días, David: Lo que está pasando es que estás restando el primer valor de df_2 a todos los valores de la primera fila de df_1, el 2º valor a la 2ª fila, y así sucesivamente. Lo más fácil en este caso sería usar la función apply(). Por ejemplo: t( apply(df_1[,cols], MARGIN=1, FUN= function(x) x - (df_2$valor))) # o, de forma resumida, sin nombrar los argumentos t( apply(df_1[,cols], 1, function(x) x - (df_2$valor))) # O si quieres el resultado en el mismo orden que en la matriz original t( apply(df_1[,cols], 1, function(x) x - (df_2$valor)))[,names(df_1)] Un saludo, Marcelino El 14/03/2023 a las 20:45, David Camilo Gomez Medina escribió:> Buen día estimados, > > Tengo el siguiente código: > > df_1 <- data.frame(ana = c(15, 20, 30), maria = c(15,20,30), jose = c(15, > 20, 30)) > > df_2 <- data.frame(nombre = c("jose", "ana", "maria"), valor = c(1,2,3)) > > # Find the corresponding columns in df_1 based on the values in df_2$nombre > cols <- match(df_2$nombre, names(df_1)) > > # Subtract the values of df_2$valor from the corresponding columns of df_1 > df_1[,cols] <- df_1[,cols] - (df_2$valor) > > # Print the resulting data frame > df_1 > > y mi resultado es el siguiente: > > ana maria jose > 1 14 14 14 > 2 18 18 18 > 3 27 27 27 > > Pero el resultado debería ser: > > ana maria jose > 1 13 12 14 > 2 18 17 19 > 3 28 27 29 > > ¿Saben qué podría estar pasando? > > Quedo muy atento, gracias. >-- Marcelino de la Cruz Rot Depto. de Biología y Geología Física y Química Inorgánica Universidad Rey Juan Carlos Móstoles España
David Camilo Gomez Medina
2023-Mar-15 17:38 UTC
[R-es] Resultado operación entre dataframes
Hola a todos, Muchísimas gracias por sus comentarios y ayuda. Me sirvió mucho las maneras que me mostraron de solucionar el problema. Encontré otra manera de resolverlo utilizando la librería dplyr, me gustaría compartirles esta forma: df_1 %>% mutate(across(all_of(df_2$nombre), ~ . - df_2$valor[match(cur_column(), df_2$nombre)])) Cordialmente, David. On Tue, 14 Mar 2023 at 14:45, David Camilo Gomez Medina < dcgomezme en unal.edu.co> wrote:> Buen día estimados, > > Tengo el siguiente código: > > df_1 <- data.frame(ana = c(15, 20, 30), maria = c(15,20,30), jose = c(15, > 20, 30)) > > df_2 <- data.frame(nombre = c("jose", "ana", "maria"), valor = c(1,2,3)) > > # Find the corresponding columns in df_1 based on the values in df_2$nombre > cols <- match(df_2$nombre, names(df_1)) > > # Subtract the values of df_2$valor from the corresponding columns of df_1 > df_1[,cols] <- df_1[,cols] - (df_2$valor) > > # Print the resulting data frame > df_1 > > y mi resultado es el siguiente: > > ana maria jose > 1 14 14 14 > 2 18 18 18 > 3 27 27 27 > > Pero el resultado debería ser: > > ana maria jose > 1 13 12 14 > 2 18 17 19 > 3 28 27 29 > > ¿Saben qué podría estar pasando? > > Quedo muy atento, gracias. > >-- *Aviso legal:* El contenido de este mensaje y los archivos adjuntos son confidenciales y de uso exclusivo de la Universidad Nacional de Colombia. Se encuentran dirigidos sólo para el uso del destinatario al cual van enviados. La reproducción, lectura y/o copia se encuentran prohibidas a cualquier persona diferente a este y puede ser ilegal. Si usted lo ha recibido por error, infórmenos y elimínelo de su correo. Los Datos Personales serán tratados conforme a la Ley 1581 de 2012 y a nuestra Política de Datos Personales que podrá consultar en la página web www.unal.edu.co <http://www.unal.edu.co/>.* *Las opiniones, informaciones, conclusiones y cualquier otro tipo de dato contenido en este correo electrónico, no relacionados con la actividad de la Universidad Nacional de Colombia, se entenderá como personales y de ninguna manera son avaladas por la Universidad. [[alternative HTML version deleted]]