如何将monadic数据转换为R中的二元数据(country-year到pair-year)?

use*_*257 4 r

我有按国家/年组织的数据,其中包含二元关系的ID.我想通过二年级组织这个.

以下是我的数据组织方式:

     dyadic_id country_codes year
  1          1           200 1990
  2          1            20 1990
  3          1           200 1991
  4          1            20 1991
  5          2           300 1990
  6          2            10 1990
  7          3           100 1990
  8          3            10 1990
  9          4           500 1991
  10         4           200 1991
Run Code Online (Sandbox Code Playgroud)

以下是我希望如何组织数据:

  dyadic_id_want country_codes_1 country_codes_2 year_want
1              1             200              20      1990
2              1             200              20      1991
3              2             300              10      1990
4              3             100              10      1990
5              4             500             200      1991
Run Code Online (Sandbox Code Playgroud)

这是可重现的代码:

dyadic_id<-c(1,1,1,1,2,2,3,3,4,4)
country_codes<-c(200,20,200,20,300,10,100,10,500,200)
year<-c(1990,1990,1991,1991,1990,1990,1990,1990,1991,1991)
mydf<-as.data.frame(cbind(dyadic_id,country_codes,year))
Run Code Online (Sandbox Code Playgroud)

我希望mydf看起来像df_i_want

dyadic_id_want<-c(1,1,2,3,4)
country_codes_1<-c(200,200,300,100,500)
country_codes_2<-c(20,20,10,10,200)
year_want<-c(1990,1991,1990,1990,1991)
my_df_i_want<-as.data.frame(cbind(dyadic_id_want,country_codes_1,country_codes_2,year_want))
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以使用不同的方法从"长"到"宽"重塑.下面描述两个.

使用'data.table',我们将'data.frame'转换为'data.table'(setDT(mydf)),创建一个序列列('ind'),按'dyadic_id'和'year'分组.然后,我们使用将数据集从"long"转换为"wide"格式dcast.

library(data.table)
setDT(mydf)[, ind:= 1:.N, by = .(dyadic_id, year)]
dcast(mydf, dyadic_id+year~ paste('country_codes', ind, sep='_'), value.var='country_codes')
#   dyadic_id year country_codes_1 country_codes_2
#1:         1 1990             200              20
#2:         1 1991             200              20
#3:         2 1990             300              10
#4:         3 1990             100              10
#5:         4 1991             500             200
Run Code Online (Sandbox Code Playgroud)

或者使用dplyr/tidyr,我们也这样做,即通过'dyadic_id','year'进行分组,创建'ind'列(mutate(...),并使用spreadfrom tidyr来重塑为'wide'格式.

library(dplyr)
library(tidyr)
mydf %>% 
    group_by(dyadic_id, year) %>%
    mutate(ind= paste0('country_codes', row_number())) %>% 
    spread(ind, country_codes)
#    dyadic_id  year country_codes1 country_codes2
#       (dbl) (dbl)          (dbl)          (dbl)
#1         1  1990            200             20
#2         1  1991            200             20
#3         2  1990            300             10
#4         3  1990            100             10
#5         4  1991            500            200
Run Code Online (Sandbox Code Playgroud)