Как объединить два data.frames вместе в R, сославшись на справочную таблицу

Я пытаюсь объединиться два data.frames вместе, на основе общего имени столбца в каждом из них названный series_id. Вот мой оператор слияния:

merge(test_growth_series_LUT,  test_growth_series, by = intersect(series_id, series_id))

Ошибка, которую я получаю,

Ошибка в as.vector (y): возразите 'series_id', не найденному

Справка дает это описание, но я не вижу, почему это не может найти series_id. Данные в качестве примера ниже.

### S3 method for class 'data.frame':
   #merge(x, y, by = intersect(names(x), names(y)),
   #      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
   #      sort = TRUE, suffixes = c(".x",".y"), ...)



# Create a long data.frame to store data...
test_growth_series = data.frame ("read_day" = c(0, 3, 9, 0, 3, 9, 0, 2, 8), 
"series_id" = c("p1s1", "p1s1", "p1s1", "p1s2", "p1s2", "p1s2", "p3s4", "p3s4", "p3s4"),
"mean_od" = c(0.6, 0.9, 1.3, 0.3, 0.6, 1.0, 0.2, 0.5, 1.2),
"sd_od" = c(0.1, 0.2, 0.2, 0.1, 0.1, 0.3, 0.04, 0.1, 0.3),
"n_in_stat" = c(8, 8, 8, 8, 7, 5, 8, 7, 2)
)

# Create a name LUT
test_growth_series_LUT = data.frame ("series_id" = c("p1s1", "p1s2", "p3s4", "p4s2", "p5s2", "p6s2", "p7s4", "p8s4", "p9s4"),"description" = c("blah1", "blah2", "blah3", "blah4", "blah5", "blah6", "blah7", "blah8", "blah9")
)

> test_growth_series
  read_day series_id mean_od sd_od n_in_stat
1        0      p1s1     0.6  0.10         8
2        3      p1s1     0.9  0.20         8
3        9      p1s1     1.3  0.20         8
4        0      p1s2     0.3  0.10         8
5        3      p1s2     0.6  0.10         7
6        9      p1s2     1.0  0.30         5
7        0      p3s4     0.2  0.04         8
8        2      p3s4     0.5  0.10         7
9        8      p3s4     1.2  0.30         2
> test_growth_series_LUT
  series_id description
1      p1s1       blah1
2      p1s2       blah2
3      p3s4       blah3
4      p4s2       blah4
5      p5s2       blah5
6      p6s2       blah6
7      p7s4       blah7
8      p8s4       blah8
9      p9s4       blah9
> 



this is what I'm trying to achieve:  
> new_test_growth_series
  read_day series_id mean_od sd_od n_in_stat        description
1        0      p1s1     0.6  0.10         8        blah1
2        3      p1s1     0.9  0.20         8        blah1
3        9      p1s1     1.3  0.20         8        blah1
4        0      p1s2     0.3  0.10         8        blah2
5        3      p1s2     0.6  0.10         7        blah2
6        9      p1s2     1.0  0.30         5        blah2
7        0      p3s4     0.2  0.04         8        blah3
8        2      p3s4     0.5  0.10         7        blah3
9        8      p3s4     1.2  0.30         2        blah3
5
задан Marin Sagovac 11 April 2016 в 19:57
поделиться

2 ответа

Вы можете просто сделать это:

merge(test_growth_series_LUT, test_growth_series)

Он автоматически сопоставит имена. Если вам нужно указать столбец, вы делаете это так:

merge(test_growth_series_LUT, test_growth_series, by = "series_id")

Или так, если вам нужно указать с обеих сторон (требуется только в том случае, если у них разные имена, по которым вы хотите сопоставить):

merge(test_growth_series_LUT, test_growth_series, by.x = "series_id", by.y = "series_id")

Я рекомендую поискать в примерах (и просмотре их), перейдя к справке по слиянию (? merge ) или вызвав example ("merge", "base") (менее полезно, чем на самом деле пройти через это самостоятельно.

Два примечания:

  1. Вам никогда не понадобится использовать здесь функцию пересечения. Используйте c () , чтобы явно указать несколько имен столбцов. Или используйте all , all.x и all.y параметры, чтобы указать, какой тип соединения вы хотите.
  2. В большинстве случаев вы можете использовать кавычки для указания имени столбца, если вы не прикрепили данные. В противном случае он будет жаловаться на то, что не может найти имя. В частности, имя должно быть в пути поиска, когда вы не используете кавычки.
9
ответ дан 13 December 2019 в 22:06
поделиться

Я получаю сообщение об ошибке: «Ошибка в as.vector (y): объект 'series_id' не найден»

На столбец в вашем data.frame можно ссылаться так: test_growth_series $ series_id , который возвращает вектор series_id. Выполнение пересечения не является необходимым , но было бы правильно записано так:

intersect(test_growth_series$series_id, test_growth_series_LUT$series_id)

Чтобы быть немного более правильным, вы, вероятно, захотите выполнить левое соединение , используя all. х = ИСТИНА . Это покрывает вас в случае, если series_id из test_growth_series не отображается в вашей таблице поиска. Без него в результате могут отсутствовать строки.

merge(test_growth_series, test_growth_series_LUT, by = "series_id", all.x=TRUE)

Эта тема также обсуждается в Как объединить кадры данных в R (внутренний, внешний, левый, правый)?

1
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: