Tengo dos conjuntos de datos (uno para cada país) que se ven así:

dfGermany
Country Sales Year Code
Germany 2000  2000 221
Germany 1500  2001 150
Germany 2150  2002 270

dfJapan
Country Sales Year Code    
Japan   500   2000 221
Japan   750   2001 221
Japan   800   2001 270
Japan   1000  2002 270

Code aquí está el "nombre" del producto. Lo que quiero hacer es tomar la mitad de la venta japonesa y agregarla al df para Alemania si el code y el year coinciden.

Entonces, por ejemplo, la mitad del valor de ventas del producto 221 y 270 en dfJapan (250 € y 500 €) debe agregarse a dfGermany para el año {{X4} } y 2002. Pero no debería pasar nada con los valores de 2001 ya que code no coincide con year.

Intenté con merge, pero esa función no funcionó porque los datos son de diferente tamaño y también quiero hacer coincidir el año y el valor.

1
KGB91 15 oct. 2018 a las 18:58

2 respuestas

La mejor respuesta

Podemos unirnos en 'Año', 'Código' y luego actualizar la columna 'dfGermany' 'Ventas'

library(data.table)
setDT(dfGermany)[dfJapan, Sales := Sales + i.Sales/2, on = .(Year, Code)]
dfGermany
#   Country Sales Year Code
#1: Germany  2250 2000  221
#2: Germany  1500 2001  150
#3: Germany  2650 2002  270

Datos

dfGermany <- structure(list(Country = c("Germany", "Germany", "Germany"), 
Sales = c(2000, 1500, 2150), Year = 2000:2002, Code = c(221L, 
150L, 270L)), row.names = c(NA, -3L), class = "data.frame")

dfJapan <- structure(list(Country = c("Japan", "Japan", "Japan", "Japan"
), Sales = c(500L, 750L, 800L, 1000L), Year = c(2000L, 2001L, 
2001L, 2002L), Code = c(221L, 221L, 270L, 270L)),
 class = "data.frame", row.names = c(NA, -4L))
3
akrun 15 oct. 2018 a las 16:04

Usando dplyr y los datos proporcionados por @ akrun:

library(dplyr)

dfGermany %>%
  left_join(dfJapan %>%
              select(Year, Code, sales_japan = Sales),
            by = c('Year', 'Code')) %>%
  mutate(Sales = Sales + coalesce(sales_japan / 2, 0)) %>%
  select(-sales_japan)

> dfGermany
  Country Sales Year Code
1 Germany  2250 2000  221
2 Germany  1500 2001  150
3 Germany  2650 2002  270
2
zack 15 oct. 2018 a las 16:19