在R中,当两个数据帧中的某些值相等时,如何将一个数据帧中的某些特定列添加到另一个数据帧中?

时间:2019-05-06 13:08:47

标签: r

我有两个具有相同国家(地区)和年份(行和年份)行组合的数据集,我想以行组合匹配的方式将一个数据集中的某些列添加到另一数据集中。

数据集1:

+----------+------+---------+---------+-----+
| Country  | Year | exports | imports | ... |
+----------+------+---------+---------+-----+
| Germany  | 2000 | 0.70    | 0.40    | ... |
| Germany  | 2001 | 0.68    | 0.41    | ... |
| Germany  | 2002 | 0.71    | 0.48    | ... |
| Germany  | 2003 | ...     | ...     | ... |
| Spain    | 2000 | 0.51    | 0.56    | ... |
| Spain    | 2001 | 0.48    | 0.50    | ... |
| Spain    | 2002 | 0.50    | 0.53    | ... |
| Spain    | 2003 | ...     | ...     | ... |
| ...      | ...  | ...     | ...     | ... |
+----------+------+---------+---------+-----+

数据集2:

+----------+-----+------+--------------+-------+-----+
| Country  | CC  | Year | unemployment | Pop   | ... |
+----------+-----+------+--------------+-------+-----+
| Germany  | GER | 2000 | 0.03         | 79.50 | ... |
| Germany  | GER | 2001 | 0.05         | 79.53 | ... |
| Germany  | GER | 2002 | 0.04         | 79.80 | ... |
| Germany  | GER | 2003 | ...          | ...   | ... |
| Hungary  | HUN | 2000 | ...          | ...   | ... |
| Hungary  | HUN | 2001 | ...          | ...   | ... |
| Hungary  | HUN | 2002 | ...          | ...   | ... |
| Hungary  | HUN | 2003 | ...          | ...   | ... |
| Spain    | ESP | 2000 | 0.08         | 40.2  | ... |
| Spain    | ESP | 2001 | 0.11         | 40.5  | ... |
| Spain    | ESP | 2002 | 0.10         | 40.55 | ... |
| Spain    | ESP | 2003 | ...          | ...   | ... |
| ...      | ... | ...  | ...          | ...   | ... |
+----------+-----+------+--------------+-------+-----+

我希望合并后的数据看起来像这样:


+----------+-----+------+---------+---------+--------------+-------+-----+
| Country  | CC  | Year | exports | imports | unemployment | Pop   | ... |
+----------+-----+------+---------+---------+--------------+-------+-----+
| Germany  | GER | 2000 | 0.70    | 0.40    | 0.03         | 79.50 | ... |
| Germany  | GER | 2001 | 0.68    | 0.41    | 0.05         | 79.53 | ... |
| Germany  | GER | 2002 | 0.71    | 0.48    | 0.04         | 79.80 | ... |
| Germany  | GER | 2003 | ...     | ...     | ...          | ...   | ... |
| Spain    | ESP | 2000 | 0.51    | 0.56    | 0.08         | 40.2  | ... |
| Spain    | ESP | 2001 | 0.48    | 0.50    | 0.11         | 40.5  | ... |
| Spain    | ESP | 2002 | 0.50    | 0.53    | 0.10         | 40.55 | ... |
| Spain    | ESP | 2003 | ...     | ...     | ...          | ...   | ... |
| ...      | ... | ...  | ...     | ...     | ...          | ...   | ... |
+----------+-----+------+---------+---------+--------------+-------+-----+

因此,不在数据集1中的国家(在这种情况下为匈牙利)不在合并的数据集中,并且国家/地区代码也在新的数据集中。有人可以告诉我如何实现这一目标吗?我有28年的经验,每个国家约有100个国家。因此,使用必须指定每种组合的函数将不方便...

我尝试将其与merge()合并,但未成功,因为它仅创建了具有相同国家和年份组合的数百行。

3 个答案:

答案 0 :(得分:2)

绝对应该为此工作。您应该指定要合并在两列上。

merge( df1 , df2 , by=c( "Country", "Year") )

还请确认合并的var的类相同

sapply( df1[, c( "Country", "Year")] , class )
sapply( df2[, c( "Country", "Year")] , class )

确认变量在两个数据框中的拼写方式相同

intersect( names( df1 ) , names( df2 ))

最后确认年份和国家/地区在两个数据框中都是唯一的

sum( duplicated( df1[ ,c( "Country", "Year") ] ))
sum( duplicated( df2[ ,c( "Country", "Year") ] ))

答案 1 :(得分:1)

您可以使用inner_join()软件包中的dplyr来完成此操作

dplyr::inner_join(df1, df2, by=c("Country", "Year"))

答案 2 :(得分:0)

使用merge()的答案有效!现在我面临的问题是西班牙没有2000年的失业数据。但是,我仍然想添加西班牙的所有年份,并希望在合并数据集中2000年西班牙的失业率栏中具有NA。我该如何实现?

我尝试使用merge(df1, df2, all.x = TRUE),但有时出于某种原因它只是创建NA ...