【问题标题】:In R, how can I add some specific columns from a dataframe to another dataframe when some values are equal in both dataframes?在 R 中,当两个数据帧中的某些值相等时,如何将数据帧中的某些特定列添加到另一个数据帧?
【发布时间】:2019-09-24 03:11:01
【问题描述】:

我有两个具有相同行组合 Country 和 Year 的数据集,我想以行组合匹配的方式将一个数据集中的一些列添加到另一个数据集中。

数据集 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() 合并,但没有成功,因为它只是创建了数百行具有相同国家和年份组合的行。

【问题讨论】:

  • "我试图将它与merge() 合并,但没有成功..." 你到底尝试了什么? merge 肯定是此任务的明智选择,前提是它使用正确。分享你的尝试并描述为什么结果不是你想要的。

标签: r


【解决方案1】:

您可以使用来自dplyr 包的inner_join() 执行此操作

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

【讨论】:

    【解决方案2】:

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

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

    还要确认合并变量的类是一样的

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

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

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

    最后确认年份和国家在两个data.frames中都是唯一的

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

    【讨论】:

      【解决方案3】:

      merge() 的答案有效!现在我面临的问题是,例如西班牙没有 2000 年的任何失业数据。但是,我仍然想添加西班牙的所有年份,并希望在合并数据集中的 2000 年西班牙的失业列中有一个 NA。我怎样才能做到这一点?

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

      【讨论】:

      • 试试merge(df1, df2, all=TRUE)。另见post
      猜你喜欢
      • 2022-01-24
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多