面板数据,从宽到长,多变量
Panel data, from wide to long with multiple variables
我正在努力处理具有多个变量的长格式的大量面板数据。看起来像这样
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
而我trying/struggling把它强制到这个结构
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
您需要 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 创建
看起来您可以通过混合使用 tidyverse
包中的 spread
和 gather
函数来解决您的问题。
编辑:实际上这个包是tidyr
,它是tidyverse
包
的一部分
你可以分两步解决这个问题。
第一个:按年份和值收集,创建一个名为 "measurement"
的新列
> 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
第二:由你的新"variable"和"measurement"
传播
> dat_2 <- dat_1 %>% spread(key="variable",value="measurement")
> dat_2
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
衷心希望这能解决您的问题。
我正在努力处理具有多个变量的长格式的大量面板数据。看起来像这样
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
而我trying/struggling把它强制到这个结构
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
您需要 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 创建看起来您可以通过混合使用 tidyverse
包中的 spread
和 gather
函数来解决您的问题。
编辑:实际上这个包是tidyr
,它是tidyverse
包
你可以分两步解决这个问题。
第一个:按年份和值收集,创建一个名为 "measurement"
的新列> 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
第二:由你的新"variable"和"measurement"
传播> dat_2 <- dat_1 %>% spread(key="variable",value="measurement")
> dat_2
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
衷心希望这能解决您的问题。