Multiplicar sólo las columnas con los nombres de columna mismos

votos
-3

Tengo un conjunto de datos de la siguiente manera:

df1

Col1   Col2    A    B    C
   A      1    2    3    4
   B      2    5    7    8

df2

A    B     C   D    E
2    3     4   7   10

Quiero multiplicar sólo las columnas que son coincidentes en ambas tramas de datos.

Producto final esperado:

Col1   Col2     A    B     C
   A      1     4    9    16
   B      2    10   21    32

Mi trama de datos tiene muchas columnas por lo que si esto podría ser dinámico de algún modo, sería muy útil.

Publicado el 07/11/2018 a las 22:29
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3
nm <- intersect(names(df1), names(df2))
df1[nm] <- sweep(df1[nm], 2, unlist(df2[nm]), `*`)
df1
#   Col1 Col2  A  B  C
# 1    A    1  4  9 16
# 2    B    2 10 21 32

El uso sweepes el principal truco aquí.

Respondida el 07/11/2018 a las 22:44
fuente por usuario

votos
2

df1[] <- mapply(function(nm, dat) if (nm %in% names(df2) && is.numeric(dat)) dat*df2[[nm]] else dat,
                names(df1), df1, SIMPLIFY=FALSE)
df1
#   Col1 Col2  A  B  C
# 1    A    1  4  9 16
# 2    B    2 10 21 32

El df1[] <- ...es efectiva (aunque no precisamente) un acceso directo de df1 <- as.data.frame(...).

Estaba a punto de sugerir intersectque la respuesta de Julius se acercó ... pero voy a incluir que esté completa (ya que el resto de esa respuesta es un poco diferente de todos modos):

df1[intersect(names(df1), names(df2))] <- 
  mapply(function(nm, dat) dat*df2[[nm]],
         intersect(names(df1), names(df2)), df1[intersect(names(df1), names(df2))], SIMPLIFY=FALSE)
Respondida el 07/11/2018 a las 22:41
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more