如何重塑这个复杂的数据框架?

时间:2013-01-28 12:30:35

标签: r reshape

这是我的前4行数据;

  X...Country.Name Country.Code                               Indicator.Name
1           Turkey          TUR           Inflation, GDP deflator (annual %)
2           Turkey          TUR Unemployment, total (% of total labor force)
3      Afghanistan          AFG           Inflation, GDP deflator (annual %)
4      Afghanistan          AFG Unemployment, total (% of total labor force)
     Indicator.Code     X2010
1 NY.GDP.DEFL.KD.ZG  5.675740
2    SL.UEM.TOTL.ZS 11.900000
3 NY.GDP.DEFL.KD.ZG  9.437322
4    SL.UEM.TOTL.ZS        NA

我希望我的数据重新整理成两个列,每个指标代码之一,我希望每一行对应一个国家/地区,就像这样;

Country Name NY.GDP.DEFL.KD.ZG SL.UEM.TOTL.ZS
Turkey       5.6         11.9
Afghanistan  9.43        NA

我想我可以用Excel做到这一点,但我想学习R方式,这样每次遇到问题时我都不需要依赖excel。如果您需要,可以Here is dput数据。

编辑:我实际上想要3个列,每个指标一个,国家名称一个。

1 个答案:

答案 0 :(得分:4)

坚持使用基础R,使用reshape。我冒昧地清理了列名。在这里,我只向您展示几行输出。删除head以查看完整输出。假设您的data.frame被命名为“mydata”。

names(mydata) <- c("CountryName", "CountryCode", 
                   "IndicatorName", "IndicatorCode", "X2010")
head(reshape(mydata[-c(2:3)], 
             direction = "wide", 
             idvar = "CountryName", 
             timevar = "IndicatorCode"))
#       CountryName X2010.NY.GDP.DEFL.KD.ZG X2010.SL.UEM.TOTL.ZS
# 1          Turkey                5.675740                 11.9
# 3     Afghanistan                9.437322                   NA
# 5         Albania                3.459343                   NA
# 7         Algeria               16.245617                 11.4
# 9  American Samoa                      NA                   NA
# 11        Andorra                      NA                   NA

基地R中的另一个选项是xtabs,但NA0取代:

head(xtabs(X2010 ~ CountryName + IndicatorCode, mydata))
#                 IndicatorCode
# CountryName      NY.GDP.DEFL.KD.ZG SL.UEM.TOTL.ZS
#   Afghanistan             9.437322            0.0
#   Albania                 3.459343            0.0
#   Algeria                16.245617           11.4
#   American Samoa          0.000000            0.0
#   Andorra                 0.000000            0.0
#   Angola                 22.393924            0.0

xtabs的结果是matrix,因此如果您想要data.frame,请使用as.data.frame.matrix包装输出。