Перегруппировка фрейма данных в R для анализа панели - PullRequest
0 голосов
/ 05 марта 2020

У меня проблемы с перестановкой данных, чтобы они подходили для группового анализа. Необработанные данные выглядят так (есть все страны и 50 лет, это только голова):

head(suicide_data_panel)

country     variable  1970  1971 
Afghanistan suicide   NA    NA          
Afghanistan unempl    NA    NA          
Afghanistan hci       NA    NA      
Afghanistan gini      NA    NA          
Afghanistan inflation NA    NA          
Afghanistan cpi       NA    NA          

Мне бы хотелось, чтобы это было:

country     year    suicide  unempl 
Afghanistan 1970      NA    NA          
Afghanistan 1971      NA    NA          
Afghanistan 1972      NA    NA      
Afghanistan 1973      NA    NA          
Afghanistan 1974      NA    NA          
Afghanistan 1975      NA    NA

Чтобы я мог запустить панель регрессии. Я пытался использовать dcast, но я не знаю, как сделать так, чтобы он учитывал разные годы:

suicide <- dcast(suicide_data_panel, country~variable, sum)

Эта команда приведет к учету только последнего года:

head(suicide)

    country         account    alcohol     
1   Afghanistan     -18.874843  NA  
2   Albania         -6.689212   NA  
3   Algeria         NA          NA  
4   American Samoa  NA          NA      
5   Andorra         NA          NA      
6   Angola          7.000035    NA

Сортировка переменных по алфавиту. Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Вы можете сделать это сначала: используя функцию MELT с вашими переменными идентификатора "country" и "variable"; и второе: использование функции dcast для преобразования «переменной» в отдельные столбцы.

1 голос
/ 05 марта 2020

Вы можете попытаться использовать пакет tidyverse:

library(tidyverse)

suicide_data_panel %>%
  gather(year, dummy, -country, -variable) %>%
  spread(variable, dummy)
0 голосов
/ 05 марта 2020

После подхода reshape.

tm <- by(dat, dat$variable, reshape, varying=3:4, idvar="country", 
         direction="long", sep="", timevar="year", drop=2)
res <- cbind(el(tm)[1:2], data.frame(mapply(`[[`, tm, 3)))
res
#         country year         hci    suicide     unempl
# DE.1970      DE 1970  1.51152200  1.3709584  0.6328626
# AT.1970      AT 1970 -0.09465904 -0.5646982  0.4042683
# CH.1970      CH 1970  2.01842371  0.3631284 -0.1061245
# DE.1971      DE 1971  0.63595040 -0.0627141 -1.3888607
# AT.1971      AT 1971 -0.28425292  1.3048697 -0.2787888
# CH.1971      CH 1971 -2.65645542  2.2866454 -0.1333213

Данные

set.seed(42)
dat <- cbind(expand.grid(country=c("DE", "AT", "CH"),
                         variable=c("suicide", "unempl", "hci"),
             stringsAsFactors=F), x1970=rnorm(9), x1971=rnorm(9))
...