我正在努力处理具有多个变量的长格式的大型面板数据。看起来像这样
set.seed(42)
dat_0=
data.frame(
c(rep('AFG',2),rep('UK',2)),
c(rep(c('GDP','pop'),2)),
runif(4),
runif(4))
colnames(dat_0)<-c('country','variable','2010','2011')
产生这样的数据帧:
country variable 2010 2011
1 AFG GDP 0.535761290 0.7515226
2 AFG pop 0.002272966 0.4527316
3 UK GDP 0.608937453 0.5357900
4 UK pop 0.836801559 0.5373767
我正在尝试/努力将其强制为这种结构
country year GDP pop
1 AFG 2010 0.5357612 0.0022729
2 AFG 2011 0.7515226 0.4527316
3 UK 2010 0.6089374 0.8368015
4 UK 2011 0.5357900 0.5373767
很抱歉,如果我重复一遍,我似乎在为reshape / tidyr / dplyr而苦苦挣扎
答案 0 :(得分:0)
您需要先gather
,然后再spread
:
library(tidyverse)
set.seed(42)
dat_0 <- data.frame(c(rep("AFG", 2), rep("UK", 2)), c(rep(c("GDP", "pop"), 2)), runif(4), runif(4))
colnames(dat_0) <- c("country", "variable", "2010", "2011")
dat_0 %>%
gather(year, value, `2010`, `2011`) %>%
spread(variable, value)
#> country year GDP pop
#> 1 AFG 2010 0.9148060 0.9370754
#> 2 AFG 2011 0.6417455 0.5190959
#> 3 UK 2010 0.2861395 0.8304476
#> 4 UK 2011 0.7365883 0.1346666
由reprex package(v0.2.1)于2019-02-20创建
答案 1 :(得分:0)
看起来您可以将if (flag == O_SOMETHING) {...}
包中的spread
和gather
函数混合使用来解决问题。
编辑:实际上,该软件包是tidyverse
,它是tidyr
软件包的一部分
您可以分两个步骤解决此问题。
第一:按年份和值进行收集,创建一个名为“测量”的新列
tidyverse
第二:通过新的“变量”和“度量”进行传播
> dat_1 <- dat_0 %>% gather(key="year",value="measurement","2010":"2011")
> dat_1
country variable year measurement
1 AFG GDP 2010 0.9148060
2 AFG pop 2010 0.9370754
3 UK GDP 2010 0.2861395
4 UK pop 2010 0.8304476
5 AFG GDP 2011 0.6417455
6 AFG pop 2011 0.5190959
7 UK GDP 2011 0.7365883
8 UK pop 2011 0.1346666
我衷心希望这能解决您的问题。