【问题标题】:How to calculate a score/indicator in R?如何计算 R 中的分数/指标?
【发布时间】:2015-11-04 05:13:47
【问题描述】:

我想尝试计算一个分数或创建一个指数,以给出世界经济中国家“边缘化”的程度。换句话说,一个表明国家在世界经济中的地位的指数。

基本上,我尝试复制其他人的指标。他将世界经济中的“边缘化”定义为该国在世界贸易中所占百分比的函数。

它的计算方法是:一个特定国家的总进口 + 总出口除以总进口 + 世界经济的出口。除以 100 的倒数。

我试图弄清楚如何使用我的数据在 R 中计算这个。下面我举一个(真实的)例子。

Country  Year     EXPORT(%GDP)  IMPORT(%GDP)   GDP(current$) 
A        2001        22,14        21,96            3,78(+11)                    
B        2001        35,43        31,80            5387293(..)
C        2001        27,22        30,84            1,90
WORLD    2001        24,43        24,20            3,30(+13)

为了清楚起见,我想在我的数据中计算每个国家和年份的分数(大约 150 个国家,从 1990 年到 2014 年)。等式是(再次明确):进口+出口(对于数据集中的给定国家)/进口+出口(世界经济,请参见示例中的变量“WORLD”。

编辑:当前 $ 的另一个示例(如果这有任何帮助)

Country  Year     EXPORT(current$)  IMPORT(c$)          GDP(c$) 
    A        2001        8,38177(..)   8,31506           3,78(+11)                    
    B        2001        1,90875(..)   1,71328           5,387293(..)
    C        2001        5,1872(..)    5,87710           1,90
    WORLD    2001        7,6811(..)    7,7101            3,30(+13)

【问题讨论】:

  • 存在建模问题:Export 和 Import 中的数字对您的计算没有意义。经验。和小鬼。被定义为每个国家/地区的 GDP 百分比:您必须在第五列中提及该 GDP 以计算进出口的原始价值。根据这些原始值,我们可以应用您的公式(但我们不能应用百分比!)
  • @ColonelBeauvel 谢谢——有道理。我也有 EXP/IMP 的原始值(当前商品和服务的 Exp/Imp 美元)。我现在已将 GDP 添加到 inte 数据框中。如何在 R 中进行计算?
  • 我仍然无法理解用于您建议目的的数据。国家 A、B、abd C 的总数远远超过 WORLD 的值。
  • @BondedDust 我也在考虑这个问题。数据得到很好的利用,来自世界银行(世界发展指标)。不知道他们是如何计算的。但有些国家是出口/进口值大/小的异常值,这是有道理的。这只是我的数据样本。不确定实际值对 R 代码是否重要?在 Excel 中进行这种计算是很痛苦的,这是肯定的。
  • 关于该数据,您还没有告诉我们一些事情。

标签: r


【解决方案1】:

使用良好的旧数据表:

library( data.table)

# Thanks "TheKevinNeville" for the sample data!
country <- c("A", "B", "C", "World")
year <- c(rep(2001, 4), rep(2002, 4))
export <- abs(rnorm(8) * 5)
import <- abs(rnorm(8) * 5)
dt <- data.table( country,year,export,import)

# Here you calculate the index (rank) per group
dt[,index := (import + export) / .SD[country=="World", import + export],by=.(year)]

结果如下:

   country year   export    import    index
1:       A 2001 4.641794 7.3788739 6.222089
2:       B 2001 4.286842 1.3656420 2.925816
3:       C 2001 1.919439 1.1210429 1.573802
4:   World 2001 1.164199 0.7677355 1.000000
5:       A 2002 1.303430 3.5848178 1.478056
6:       B 2002 4.231528 2.6427575 2.078573
7:       C 2002 8.655763 7.1272979 4.772314
8:   World 2002 2.134707 1.1725057 1.000000

如果您想对每年的结果和索引(降序)进行排序,您可以添加以下代码:

# setorder reorders the rows of a data.table by reference,
# based on the columns provided. 
setorder(dt, year, -index)

【讨论】:

  • 非常感谢!我很快就会接受这个答案——不过我在应用它时遇到了一个小问题。我收到了这个错误:[.data.frame(score, , :=(index, (imp + exp)/.SD[country == : 未使用的参数 (by = .(year)) 中的错误为什么 (by=.(year )) 是未使用的参数吗?我在数据集中有一个年份变量(1989 到 2014 年),称为“年份”。
  • 您能否发布您正在使用的完整代码行?我猜您使用的是 data.frame 而不是 data.table!尝试使用“dt
  • 你说得对,我使用的是data.frame..因此我尝试了这个:“mydataYY
  • 产生错误的原始代码是:mydata[,index := (imp + exp) / .SD[country=="World", imp + exp],by=.(year) ]。其中“调解”是一个数据框。
  • 感谢您的帮助。问题是导出和导入是因素..我修复了它..你的代码完成了它的工作!
【解决方案2】:

创建数据。

country <- c("A", "B", "C", "World")
year <- c(rep(2001, 4), rep(2002, 4))
export <- abs(rnorm(8) * 5)
import <- abs(rnorm(8) * 5)

mydf <- data.frame(country=country,Year=year,EXPORT=export, IMPORT=import)

For 循环。

mydf$Score <- NA
for(i in 2001:2002){
index <- mydf[,"Year"] == i
current_world <- mydf$country[index] == "World"
mydf$Score[index] <- (mydf$EXPORT[index] + mydf$IMPORT[index]) / (mydf$EXPORT[index][current_world] + mydf$IMPORT[index][current_world])
}

【讨论】:

  • 不,不,也没有 for 循环。这不是 R 答案。
  • 这确实是 R 代码。如果你不想要一个 for 循环,你可能会使用 lapply。
  • 提供这种答案会在 R 中产生极端不良的编码习惯...使用 aggregate/data.table/dplyr 但显然不是这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多