汇总不同长度的数据帧

时间:2018-10-15 15:58:12

标签: r dataframe

我有两个看起来像这样的数据集(每个国家一个):

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是产品的“名称”。我想做的是,如果code year匹配,则将一半的日本股票出售并添加到德国的df中。

例如,221中产品270dfJapan的销售价值的一半(250欧元和500欧元)应添加到dfGermany的{​​年{1}}和2000。但是2002的值应该什么也不会发生,因为2001code不匹配。

我尝试使用year,但是该功能不起作用,因为数据大小不同,并且我还想同时匹配年份和值。

2 个答案:

答案 0 :(得分:3)

我们可以在“年份”,“代码”上进行联接,然后更新“ dfGermany”的“销售”列

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

数据

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))

答案 1 :(得分:2)

使用dplyr和@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