代码之家  ›  专栏  ›  技术社区  ›  KGB91

对不同长度的数据帧求和

  •  1
  • KGB91  · 技术社区  · 6 年前

    我有两个数据集(每个国家一个)如下所示:

    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 比赛。

    例如,产品销售额的一半 221 270 在里面 dfJapan dfGermany 2000 2002 2001 代码 不符合 .

    我试过了 merge ,但该函数不起作用,因为数据大小不同,而且我还希望同时匹配年份和值。

    2 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    我们可以对'Year'、'Code'进行联接,然后更新'dfGermany'、'Sales'列

    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))
    
        2
  •  2
  •   zack    6 年前

    使用 dplyr

    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