基于两个条件的两个数据帧变量匹配和求和的有效方法

时间:2019-01-17 14:42:37

标签: r

我有一个数据框df1,其中包含17年内397个不同行业以及几个不同出口国家/地区的进口数据。

> head(df1)
     year importer exporter      imports sic87dd
2300 1991      USA      CAN 9.404848e+05    2011
2301 1991      USA      CAN 2.259720e+04    2015
2302 1991      USA      CAN 5.459608e+02    2021
2303 1991      USA      CAN 1.173237e+04    2022
2304 1991      USA      CAN 2.483033e+04    2023
2305 1991      USA      CAN 5.353975e+00    2024

但是,我想要特定行业和特定年份的所有进口额的总和,无论它们来自何处。 (进口商始终是美国,sic87dd是唯一标识397个行业的代码)

到目前为止,我已经尝试了以下代码,该代码可以正常运行,但是效率低下,并且运行起来很费时间。

sic87dd <- unique(df1$sic87dd)
year <- unique (df1$year)
df2 <- data.frame("sic87dd" = rep(sic87dd, each = 17), "year" = rep(year, 397), imports = rep(0, 6749))
i <- 1
j <- 1

while(i <= nrow(df2)){
  while(j <= nrow(df1)){
    if((df1$sic87dd[j] == df2$sic87dd[i]) == TRUE & (df1$year[j] == df2$year[i]) == TRUE){
      df2$imports[i] <- df2$imports[i] + df1$imports[j]
    }
      j <- j + 1
  }
  i <- i + 1
  j <- 1
}

有没有更有效的方法?我在这里看到了一些有些相似的问题,并建议使用data.table包,但我不知道如何使它适合我的情况。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用dplyr有一个简单的解决方案:

首先,您需要将您的行业字段设置为一个因素(我假设整个字段由4位数字组成):

df1$sic87dd <- as.factor(df1$sic87dd)

接下来,使用group_by命令和summarise

df1 %>% 
  group_by(sic87dd) %>% 
  summarise(total_imports = sum(imports))