В R, как я могу добавить некоторые конкретные столбцы из фрейма данных в другой фрейм данных, когда некоторые значения равны в обоих фреймах данных? - PullRequest
1 голос
/ 06 мая 2019

У меня есть два набора данных, которые имеют одинаковые комбинации строк Страна и год, и я хотел бы добавить несколько столбцов из одного набора данных в другой таким образом, чтобы сочетания строк совпадали.

Набор данных 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 ]

2 голосов
/ 06 мая 2019

слияние абсолютно должно работать для этого.Следует указать, что вы объединяете два столбца.

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

Также убедитесь, что класс объединяемых переменных одинаков.

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 голос
/ 06 мая 2019

Вы можете сделать это с помощью inner_join() из dplyr пакета

dplyr::inner_join(df1, df2, by=c("Country", "Year"))
0 голосов
/ 08 мая 2019

Ответ с merge() сработал! Теперь я сталкиваюсь с проблемой, например, В Испании нет данных по безработице за 2000 год. Тем не менее, я все же хочу добавить все годы в Испании и хотел бы, чтобы в колонке безработицы для Испании в 2000 году было указано NA в объединенном наборе данных. Как мне этого добиться?

Я пытался использовать merge(df1, df2, all.x = TRUE), но иногда по какой-то причине он просто создает NA ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...