[R-es] Resultado operación entre dataframes

Marcelino de la Cruz Rot m@rce||no@de|@cruz @end|ng |rom urjc@e@
Mie Mar 15 09:41:59 CET 2023


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



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