Как объединить два data.frame вместе в 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
Решение
Вы можете просто сделать это:
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")
(менее полезно, чем пройти через это самостоятельно.
Два примечания:
- Здесь вам никогда не понадобится использовать функцию пересечения.Использовать
c()
явно указать несколько имен столбцов.Или используйтеall
,all.x
, иall.y
параметры, чтобы указать, какой тип соединения вы хотите. - В большинстве случаев для указания имени столбца можно использовать кавычки, если только вы не прикрепили данные.В противном случае он будет жаловаться на невозможность найти имя.В частности, имя должно присутствовать в пути поиска, если вы не используете кавычки.
Другие советы
Я получаю сообщение об ошибке: «Ошибка в 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.x=TRUE
.Это поможет вам в случае, если series_id из test_growth_series не появится в вашей таблице поиска.Без этого в результате вы можете пропустить строки.
merge(test_growth_series, test_growth_series_LUT, by = "series_id", all.x=TRUE)
Эта тема также обсуждается в Как объединить фреймы данных в R (внутренний, внешний, левый, правый)?