我有一个这样的数据框:(数据)
Country IndicatorName 1960 1965
France Air 2 3
France Elec 9 10
France Mobile 2 4
Germany Air 50 43
Germany Elec 43 23
Germany Mobile 45 66
USA Air 87 2
USA Elec 19 81
USA Mobile 1 77
我想拥有这些数据以便绘制它:(data_new)
Years Country Air Elect Mobile
1960 France 2 9 2
1960 Germany 50 43 45
1960 USA 87 19 1
1965 France 3 10 4
1965 Germany 43 23 66
1965 USA 2 81 77
我想转置(数据)以便拥有(data_new)。
我该怎么做?
答案 0 :(得分:3)
我们可以使用gather/spread
tidyr
重新塑造预期的格式
library(dplyr)
library(tidyr)
df1 %>%
gather(Years, Val, 3:4) %>%
spread(IndicatorName, Val)
# Country Years Air Elec Mobile
#1 France 1960 2 9 2
#2 France 1965 3 10 4
#3 Germany 1960 50 43 45
#4 Germany 1965 43 23 66
#5 USA 1960 87 19 1
#6 USA 1965 2 81 77
或使用recast
中的library(reshape2)
。该函数是melt/dcast
的包装器,其中melt
与来自gather
的{{1}}做同样的事情,即转换'宽&#39}。长期'格式,并tidyr
转换“长”'回到广泛的' (来自dcast
的{{1}})。在spread
公式中,我们可以通过指示tidyr
来使用完整的公式,或者我们可以使用dcast
来指定Country + variable ~ IndicatorName
的lh上的所有剩余变量。
...
只是为了更好地理解这一点,
~
另请注意,我们可以在 library(reshape2)
recast(df1, measure.var=c('1960', '1965'), ...~IndicatorName, value.var='value')
# Country variable Air Elec Mobile
#1 France 1960 2 9 2
#2 France 1965 3 10 4
#3 Germany 1960 50 43 45
#4 Germany 1965 43 23 66
#5 USA 1960 87 19 1
#6 USA 1965 2 81 77
步骤
melt(df1, measure.vars=c('1960', '1965')) %>%
dcast(., Country+variable~IndicatorName, value.var='value')
melt
来自 melt(df1, measure.vars=c('1960', '1965'), variable.name='Years') %>%
dcast(., Country+Years ~IndicatorName, value.var='value')
。 (这不是必需的。我们可以分两步完成这个。)
%>%