不使用for循环“转置”数据框

时间:2017-07-03 03:23:23

标签: r matrix dataframe tidyr

本身并不是真的试图转置数据帧。但我想要实现的是类似的东西。

我有一个(非常大的)格式的数据框:

variable    country         iso     2007    2008    2009    2010    2011    2012    2014
Var1        Argentina       ARG     67.3    65      63.6    60.4    56.6    54.4    57.3
Var2        Argentina       ARG     196.785 196.918 207.487 209.596 219.171 216.852 213.124
Var1        Austria         AUT     97.3    95      63.6    60.4    56.6    54.4    57.3
Var2        Austria         AUT     296.785 396.918 207.487 209.596 219.171 216.852 213.124
许多变量,年份和国家

等等。

我希望以下列形式获取:

country iso year Var1 Var2
Argentina ARG 2007 67.3 196.785
Argentina ARG 2008 65 196.918


Austria AUT 2007 97.3 296.785
Austria AUT 2008 95 396.918

依旧......

有没有干净的方法来做这个而不诉诸于循环等。??

我认为必须有一些dplyr merge函数可以实现这一点,但我似乎找不到任何东西。

1 个答案:

答案 0 :(得分:2)

tidyr可以为你做这件事。使用gatherspread。很好地学习这两个,看看例子:

library(tidyr)

df1 <- data.frame(
    variable = c("Var1", "Var2", "Var1", "Var2"),
     country = c("Argentina", "Argentina", "Austria", "Austria"),
         iso = c("ARG", "ARG", "AUT", "AUT"),
       X2007 = c(67.3, 196.785, 97.3, 296.785),
       X2008 = c(65, 196.918, 95, 396.918),
       X2009 = c(63.6, 207.487, 63.6, 207.487),
       X2010 = c(60.4, 209.596, 60.4, 209.596),
       X2011 = c(56.6, 219.171, 56.6, 219.171),
       X2012 = c(54.4, 216.852, 54.4, 216.852),
       X2014 = c(57.3, 213.124, 57.3, 213.12)
)

df1 %>% gather(Year, Value, -c(variable:iso)) %>% 
      spread(variable, Value)

阅读小插图以更好地处理它的工作原理。