Страница 1 из 1
Как работает функция merge()
Добавлено: 07 июл 2020, 17:29
VistaSV30
Добрый день!
У меня есть две таблицы A и B
Код: Выделить всё
key <- 1:10
dd <- sample(1000:2000, 10, replace = TRUE)
A <- data.frame(key, dd)
k <- sample(1:10, 50, replace = TRUE)
ss <- sample(1000:2000, 50, replace = TRUE)
B <- data.frame(k, ss)
Как сделать, чтобы в таблице B в новом столбце были записаны значения из A$dd с условием, что A$key == B$k
В мануалах нашел, что это делает базовая функция merge(), но не могу разобраться какие параметры нужны.
Спасибо!
Поправка:
Лучше использовать left_join
https://gis-lab.info/forum/viewtopic.ph ... 03#p173003
Re: Как работает функция merge()
Добавлено: 07 июл 2020, 18:45
gamm
VistaSV30 писал(а): ↑07 июл 2020, 17:29
это делает функция базовая merge(),
не в вашем случае (merge - это inner join из SQL, насоздает лишнего).
Код: Выделить всё
B$new<-NA
pos<-match(B$k,A$key)
B$new[!is.na(pos)]<-A$dd[pos[!is.na(pos)]]
Re: Как работает функция merge()
Добавлено: 07 июл 2020, 21:04
VistaSV30
Спасибо!
Пока еще не совсем понял, как это работает.
Буду разбираться.
Re: Как работает функция merge()
Добавлено: 07 июл 2020, 21:17
gamm
1. Создаем столбец, он нам нужен весь, поскольку, возможно, придется заполнять только часть, остальное останется NA
2. Ищем номера строк в А, в которых лежат ключи из В. Если что-то не найдется, будет NA
3. В те позиции В, для которых нашлось значение в А, вставляем значение. Значения NA, т.е не найденные ключи, исключаем из обработки.
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 08:11
nickleb
Код: Выделить всё
B <- merge(x = B,
y = A,
by.x = "k",
by.y = "key")
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 09:31
VistaSV30
nickleb, добрый день!
Основное назначение функции merge() - это слияние двух таблиц, при этом объединяются все столбцы таблиц.
Правильно я понимаю?
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 10:45
nickleb
VistaSV30 писал(а): ↑08 июл 2020, 09:31
при этом объединяются все столбцы таблиц
VistaSV30, здравствуйте!
Если нужны все столбцы из обеих таблиц, то можно так:
Код: Выделить всё
B <- sqldf::sqldf('select * from B inner join A on B.k = A.key')
Через
merge, вероятно, также можно получить список всех столбцов -
посмотрите аргументы и их опции и попробуйте.
На больших таблицах и
merge, и
sqldf, наверное, будут работать медленнее, чем join'ы пакета
dplyr.
Быстрее будут работать join'ы организованные через пакет
data.table.
Поставленную Вами задачу
gamm, хорошо же поэтапно выше решил и описал.
А я через
merge попробовал... Сахар синтаксиса различных обёрток порой скрывает-растворяет соль сути решаемого...
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 11:17
VistaSV30
gamm, Добрый день!
Почему-то с факторами не получается
Код: Выделить всё
key <- 1:4
dd <- c("RUS.83.12_1", "RUS.83.13_1", "RUS.83.14_1", "RUS.83.15_1")
A <- data.frame(key, dd)
k <- sample(1:4, 20, replace = TRUE)
ss <- sample(1000:2000, 20, replace = TRUE)
B <- data.frame(k, ss)
B$new<-NA
pos<-match(B$k,A$key)
B$new[!is.na(pos)]<-A$dd[pos[!is.na(pos)]]
Почему-то присваивает номера строк, а не сами значения A$dd.
Почему так происходит, просто формат A$dd поменялся.
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 11:37
nickleb
... если факторы как таковые не нужны, -
то при создании data.frame'ов
принудительно используйте опцию:
stringsAsFactors = FALSE
В Вашем случае:
Код: Выделить всё
A <- data.frame(key, dd, stringsAsFactors = FALSE)
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 11:54
gamm
Потому, что слева в присваивании не факторы, я полагаю. Фактор хранится как номер уровня и внешнее представление уровня (вот номер и присвоился). При создании поля задайте фактор с соответствующими уровнями. А еще лучше используйте символьные строки, будет меньше проблем. Как это сделать, уважаемый
nickleb написал.
Re: Как работает функция merge()
Добавлено: 08 июл 2020, 14:49
VistaSV30
Теперь работает как надо!
Спасибо коллеги!