【问题标题】:Calculate value gap between reporting importers/exporters [R}计算报告进口商/出口商之间的价值差距 [R}
【发布时间】:2021-12-15 21:41:30
【问题描述】:

我需要计算各种商品的报告数量之间的“价值差距”。例如(下表),美国报告说他们向中国出口了 4 个苹果。中国报告说他们进口了 4 个(苹果缺口为 0)。美国从中国进口了 5 个橙子,中国报告说仅出口了 4 个(1 个橙子缺口)。真正的问题有 7 个国家、10 种商品等。

#example data 
Trade.Data <- data.frame(
     Reporter = c("USA","China","USA", "China"), 
     Partner =  c("China","USA","China", "USA"),
     Flow = c("Export", "Import", "Import", "Export"), 
     Commodity = c("apple", "apple","orange", "orange"),
     Volume = c(4,4,5,4)
 )
 
 Trade.Data
  Reporter Partner   Flow Commodity Volume
1      USA   China Export     apple      4
2    China     USA Import     apple      4
3      USA   China Import    orange      5
4    China     USA Export    orange      4
 

目标是计算差异并追加到新表中:

Value.Gap
Reporter    Partner  Commodity    Gap
1    China     USA      apple      0
2      USA   China     orange      1

我想出了一个非常笨重且速度慢的方法,它可以从循环中受益。

#SO CLUNKY
fvalue <- function(dataframe, ReporterCountry, TradeFlow, PartnerCountry, Commodity){
  x <- dataframe %>% filter(
    Reporter == ReporterCountry,
    Flow == TradeFlow,
    Partner == PartnerCountry,
    Commodity == Commodity)
  print (x$Volume)
  
}

USA_import_China_apple <-fvalue(Trade.Data, "USA", "Import", "China", "apple")
China_export_USA_apple <- fvalue(Trade.Data, "China", "Export", "USA", "apple")
gap_USA_China_apple <- USA_import_China_apple - China_export_USA_apple
gap_USA_China_apple

 USA_import_China_apple <-fvalue(Trade.Data, "USA", "Import", "China", "apple")
[1] 5
> China_export_USA_apple <- fvalue(Trade.Data, "China", "Export", "USA", "apple")
[1] 4
> gap_USA_China_apple <- USA_import_China_apple - China_export_USA_apple
> gap_USA_China_apple
[1] 1

【问题讨论】:

    标签: r dataframe difference array-difference


    【解决方案1】:

    我再添加两行以使自己清楚,请让我知道这是错误的。

    Trade.Data <- data.frame(
      Reporter = c("USA","China","USA", "China", "USA", "UK"), 
      Partner =  c("China","USA","China", "USA", "UK", "USA"),
      Flow = c("Export", "Import", "Import", "Export", "Import", "Export"), 
      Commodity = c("apple", "apple","orange", "orange", "apple", "apple"),
      Volume = c(4,4,5,4, 3, 5)
    )
    
      Reporter Partner   Flow Commodity Volume
    1      USA   China Export     apple      4
    2    China     USA Import     apple      4
    3      USA   China Import    orange      5
    4    China     USA Export    orange      4
    5      USA      UK Import     apple      3
    6       UK     USA Export     apple      5
    

    使用stringr::str_splitlibrary(dplyr)

    library(stringr)
    library(dplyr)
    
    Trade.Data %>%
      mutate(key = ifelse(
        Flow == "Import",
        paste0(Reporter, "-",Partner),
        paste0(Partner, "-",Reporter)
      )) %>%
      group_by(Commodity, key) %>%
      summarize(Gap = abs(diff(Volume))) %>%
      rowwise %>%
      mutate(Reporter = str_split(key, "-", simplify = T)[1],
             Partner = str_split(key, "-", simplify = T)[2]) %>%
      select(-key)
    
      Commodity   Gap Reporter Partner
      <chr>     <dbl> <chr>    <chr>  
    1 apple         0 China    USA    
    2 apple         2 USA      UK     
    3 orange        1 USA      China 
    

    【讨论】:

    • 谢谢 Park - 很近了。输出导致信息不正确。中国和美国苹果有两个列表(0 是正确答案;2 是不正确的)。并且没有列出英国和美国苹果(其中两个会有所不同)。
    • 会将其拆分为两张表 - 一张美国报告进口,另一张报告国为出口国。那么用商品作为两个表之间的key来计算体积差?
    • @CLancaster 很抱歉,它给了我正确的答案,直到 `summary(Gap = abs(diff(Volume)))` 但是在str_split 时出错了。我编辑这部分给出正确答案。
    • @CLancaster 我无法理解其他问题。你能给我举个例子吗?(将它分成两个表.....部分)
    • 第二个不是问题,它是解决报告问题的一个想法。在rowise 出现后,我删除了所有内容。这肯定会帮助我应用到更复杂的数据集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2021-05-31
    • 1970-01-01
    • 2018-02-08
    • 2018-08-07
    相关资源
    最近更新 更多