所有
我有可能是也可能不是在R中合并两种不同类型数据的复杂问题。我正在使用定向二元年数据框架(A对B,B对A)。我想以下列方式读入或合并来自国家/地区年度数据集的数据。
假设国家/地区年数据集(x
)中的变量CY
是我想要合并到定向二元年数据集(DDY
)中的感兴趣变量。在三年(1990-1992)的四个横截面单位(A,B,C,D)的简化版本中,它看起来像这样。
country year x
A 1990 6.2352
A 1991 7.2342
A 1992 8.3902
B 1990 2.2342
B 1991 5.1292
B 1992 1.0001
C 1990 4.1202
C 1991 9.1202
C 1992 1.2011
D 1990 1.2910
D 1991 5.0001
D 1992 2.1111
我正在研究定向的二元年数据集(DDY
),它已经有许多其他感兴趣的变量。基本上,我想从x
获取CY
并在x1
中创建x2
和DDY
,在定向二元年数据中匹配x1
根据国家/地区年度数据在给定年份中设置相应的x
值,并在国家/地区年度数据中为变量x2
的{{1}}执行相同操作。
简而言之,我希望x
看起来像这样。
DDY
每个定向二元年配对的数据都会从那里开始。
我不知道的是,如果这是一个使用country1 country2 year x1 x2
A B 1990 6.2352 2.2342
A B 1991 7.2342 5.1292
A B 1992 8.3902 1.0001
A C 1990 6.2352 4.1202
A C 1991 7.2342 9.1202
A C 1992 8.3902 1.2011
A D 1990 6.2352 1.2910
A D 1991 7.2342 5.0001
A D 1992 8.3902 2.1111
B A 1990 2.2342 6.2352
B A 1991 5.1292 7.2342
B A 1992 1.0001 8.3902
...
命令的精细过程,或者其他路由是否合适。任何意见都会受到赞赏,我会提供有关我正在使用的数据的任何说明,如果它有助于找到解决方案。
This previously asked question显然是相关的。但是,由于在提出问题时没有提供可重现的代码,因此对于我想要做的事情,答案似乎有点迟钝。如果该解决方案是可行的路线,那么澄清它正在做什么可能会有所帮助。
感谢。
可重现的代码如下。
merge
答案 0 :(得分:2)
以下是从CY创建DD而无需使用SQL语法的替代方法。
ind <- expand.grid(1:nrow(CY), 1:nrow(CY))
CY.1 <- CY[ind[, 1], ]
CY.2 <- CY[ind[, 2], ]
bool <- (CY.1$year == CY.2$year) & (CY.1$country != CY.2$country)
DDY <- data.frame(country1 = CY.1$country[bool],
country2 = CY.2$country[bool],
year = CY.1$year[bool],
x1 = CY.1$x[bool],
x2 = CY.2$x[bool])
DDY <- DDY[order(country1, country2), ]
DDY
答案 1 :(得分:1)
<强> 1。只是CY 这可以仅使用CY
这样完成:
library(sqldf)
sqldf("select A.country country1, B.country country2, year, A.x x1, B.x x2
from CY A join CY B using (year)
where A.country != B.country
order by A.country, B.country")
给出:
country1 country2 year x1 x2
1 A B 1990 6.2352 2.2342
2 A B 1991 7.2342 5.1292
3 A B 1992 8.3902 1.0001
4 A C 1990 6.2352 4.1202
5 A C 1991 7.2342 9.1202
6 A C 1992 8.3902 1.2011
7 A D 1990 6.2352 1.2910
8 A D 1991 7.2342 5.0001
9 A D 1992 8.3902 2.1111
10 B A 1990 2.2342 6.2352
11 B A 1991 5.1292 7.2342
12 B A 1992 1.0001 8.3902
13 B C 1990 2.2342 4.1202
14 B C 1991 5.1292 9.1202
15 B C 1992 1.0001 1.2011
16 B D 1990 2.2342 1.2910
17 B D 1991 5.1292 5.0001
18 B D 1992 1.0001 2.1111
19 C A 1990 4.1202 6.2352
20 C A 1991 9.1202 7.2342
21 C A 1992 1.2011 8.3902
22 C B 1990 4.1202 2.2342
23 C B 1991 9.1202 5.1292
24 C B 1992 1.2011 1.0001
25 C D 1990 4.1202 1.2910
26 C D 1991 9.1202 5.0001
27 C D 1992 1.2011 2.1111
28 D A 1990 1.2910 6.2352
29 D A 1991 5.0001 7.2342
30 D A 1992 2.1111 8.3902
31 D B 1990 1.2910 2.2342
32 D B 1991 5.0001 5.1292
33 D B 1992 2.1111 1.0001
34 D C 1990 1.2910 4.1202
35 D C 1991 5.0001 9.1202
36 D C 1992 2.1111 1.2011
<强> 2。 CY和DDY
或者,要将CY
与DDY
合并,请尝试以下操作:
sqldf("select A.country country1, B.country country2, A.year, A.x x1, B.x x2
from DDY join CY A join CY B
on DDY.country1 = A.country and DDY.year = A.year
and DDY.country2 = B.country and DDY.year = B.year
order by A.country, B.country")
给出了这个:
country1 country2 year x1 x2
1 A B 1990 6.2352 2.2342
2 A B 1991 7.2342 5.1292
3 A B 1992 8.3902 1.0001
4 A C 1990 6.2352 4.1202
5 A C 1991 7.2342 9.1202
6 A C 1992 8.3902 1.2011
7 A D 1990 6.2352 1.2910
8 A D 1991 7.2342 5.0001
9 A D 1992 8.3902 2.1111
10 B A 1990 2.2342 6.2352
11 B A 1991 5.1292 7.2342
12 B A 1992 1.0001 8.3902
13 B C 1990 2.2342 4.1202
14 B C 1991 5.1292 9.1202
15 B C 1992 1.0001 1.2011
16 B D 1990 2.2342 1.2910
17 B D 1991 5.1292 5.0001
18 B D 1992 1.0001 2.1111
19 C A 1990 4.1202 6.2352
20 C A 1991 9.1202 7.2342
21 C A 1992 1.2011 8.3902
22 C B 1990 4.1202 2.2342
23 C B 1991 9.1202 5.1292
24 C B 1992 1.2011 1.0001
25 C D 1990 4.1202 1.2910
26 C D 1991 9.1202 5.0001
27 C D 1992 1.2011 2.1111
28 D A 1990 1.2910 6.2352
29 D A 1991 5.0001 7.2342
30 D A 1992 2.1111 8.3902
31 D B 1990 1.2910 2.2342
32 D B 1991 5.0001 5.1292
33 D B 1992 2.1111 1.0001
34 D C 1990 1.2910 4.1202
35 D C 1991 5.0001 9.1202
36 D C 1992 2.1111 1.2011
更新:使用CY
和DDY
添加了解决方案。