注意:这是How do I turn monadic data into dyadic data in R (country-year into pair-year)?
的修改版本我有按国家/年组织的数据,其中包含二元关系的ID。我想通过二年级组织这个。
以下是我的数据组织方式:
dyadic_id country_codes year
1 1 200 1990
2 1 20 1990
3 1 200 1991
4 1 20 1991
5 1 200 1991
6 1 300 1991
7 1 300 1991
8 1 20 1991
9 2 300 1990
10 2 10 1990
11 3 100 1990
12 3 10 1990
13 4 500 1991
14 4 200 1991
以下是我想要数据的方式:
dyadic_id_want country_codes_1 country_codes_2 year_want
1 1 200 20 1990
2 1 200 20 1991
3 1 200 300 1991
4 1 300 20 1991
5 2 300 10 1990
6 3 100 10 1990
7 4 500 200 1991
这是可重现的代码:
dyadic_id<-c(1,1,1,1,1,1,1,1,2,2,3,3,4,4)
country_codes<-c(200,20,200,20,200,300,300,20,300,10,100,10,500,200)
year<-c(1990,1990,1991,1991,1991,1991,1991,1991,1990,1990,1990,1990,1991,1991)
mydf<-as.data.frame(cbind(dyadic_id,country_codes,year))
dyadic_id_want<-c(1,1,1,1,2,3,4)
country_codes_1<-c(200,200,200,300,300,100,500)
country_codes_2<-c(20,20,300,20,10,10,200)
year_want<-c(1990,1991,1991,1991,1990,1990,1991)
my_df_i_want<-as.data.frame(cbind(dyadic_id_want,country_codes_1,country_codes_2,year_want))
这是一个独特的问题,因为每个活动都有多个国家/地区参与(由dyadic_id注明)。
答案 0 :(得分:0)
您实际上可以为dplyr
的{{3}}非常相似。不幸的是,我在data.table
没有足够的精通来帮助你完成这一部分,我相信其他人可能会更好地解决这个问题。
基本上对于mutate(ind=...)
部分,您需要更加巧妙地构建此指标,以便它是唯一的,并且会产生您正在寻找的相同结果。对于我的解决方案,我注意到由于您有两个组,因此您的指标应该只有modulus
运算符。
ind=paste0('country_codes', ((row_number()+1) %% 2+1))
然后你需要一组两个的标识符,这些标识符可以使用类似的想法再次构建。
ind_row = ceiling(row_number()/2)
然后您可以在代码中正常进行。
完整代码如下:
mydf %>%
group_by(dyadic_id, year) %>%
mutate(ind=paste0('country_codes', ((row_number()+1) %% 2+1)),
ind_row = ceiling(row_number()/2)) %>%
spread(ind, country_codes) %>%
select(-ind_row)
# dyadic_id year country_codes1 country_codes2
#1 1 1990 200 20
#2 1 1991 200 20
#3 1 1991 200 300
#4 1 1991 300 20
#5 2 1990 300 10
#6 3 1990 100 10
#7 4 1991 500 200
尽管可以归功于akrun的解决方案。