将国家年数据合并到R中的定向二元年数据

将国家年数据合并到R中的定向二元年数据,r,merge,data-manipulation,R,Merge,Data Manipulation,全部, 在R中合并两种不同类型的数据可能是一个复杂的问题,也可能不是。我正在使用一个定向二元年数据框架(a对B,B对a)。我希望以以下方式读入或合并国家年份数据集中的数据 假设国家/地区年份数据集(CY)中的变量x)是我试图合并到定向二元年份数据集(DDY)中的感兴趣变量。在三年(1990-1992年)内,四个横截面单位(a、B、C、D)的简化版本中,看起来是这样的 country year x A 1990 6.2352 A 19

全部,

在R中合并两种不同类型的数据可能是一个复杂的问题,也可能不是。我正在使用一个定向二元年数据框架(a对B,B对a)。我希望以以下方式读入或合并国家年份数据集中的数据

假设国家/地区年份数据集(
CY
)中的变量
x
)是我试图合并到定向二元年份数据集(
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
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
   ...
我正在研究定向二元年数据集(
DDY
),它已经有许多其他感兴趣的变量。基本上,我想从
CY
中获取
x
,并在
DDY
中创建
x1
x2
,将定向二元年份数据集中的
x1
与国家年份数据中给定年份中的
x
对应值进行匹配,并对国家年份数据中变量
x
中的
x2
执行相同操作

简而言之,我希望
DDY
看起来像这样

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
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
   ...
每个定向二元年配对的数据从那里开始

我不知道的是,使用
merge
命令,这是否是一个微妙的过程,或者其他路径是否最合适。如有任何意见,我将不胜感激。如果有助于找到解决方案,我将提供有关我正在使用的数据的任何澄清

这显然是相关的。然而,因为在提问时没有提供可复制的代码,所以对于我想做的事情,答案似乎有点迟钝。如果这个解决方案是可行的,那么澄清它在做什么可能会有所帮助

谢谢

可复制代码如下

country <- c("A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D", "D")
year <- c(1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992)
x <- c(6.2352, 7.2342, 8.3902, 2.2342, 5.1292, 1.0001, 4.1202, 9.1202, 1.2011, 1.2910, 5.0001, 2.1111)
CY <- data.frame(country=country, year=year, x=x)
CY

country1 <- c("A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D")
country2 <- c("B", "B", "B", "C", "C", "C", "D", "D", "D", "A", "A", "A", "C", "C", "C", "D", "D", "D", "A", "A", "A", "B", "B", "B", "D", "D", "D", "A", "A", "A", "B", "B", "B", "C", "C", "C")
year <- c(1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992, 1990, 1991, 1992)
DDY <- data.frame(country1=country1, country2=country2, year=year)
DDY

国家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

的解决方案。这里有一个替代方案,可以从CY创建DDY,而无需借助SQL synthax

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

ind感谢您提供此解决方案。第二个解决方案的后续DDY将忽略现有的DDY数据,但它是一个干净、简单的合并。谢谢,干杯。