Как работает функция merge()

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Как работает функция merge()

Сообщение VistaSV30 » 07 июл 2020, 17:29

Добрый день!

У меня есть две таблицы 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
Последний раз редактировалось VistaSV30 31 июл 2020, 09:29, всего редактировалось 5 раз.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Как работает функция merge()

Сообщение gamm » 07 июл 2020, 18:45

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)]]

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Как работает функция merge()

Сообщение VistaSV30 » 07 июл 2020, 21:04

Спасибо!
Пока еще не совсем понял, как это работает.
Буду разбираться.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Как работает функция merge()

Сообщение gamm » 07 июл 2020, 21:17

1. Создаем столбец, он нам нужен весь, поскольку, возможно, придется заполнять только часть, остальное останется NA
2. Ищем номера строк в А, в которых лежат ключи из В. Если что-то не найдется, будет NA
3. В те позиции В, для которых нашлось значение в А, вставляем значение. Значения NA, т.е не найденные ключи, исключаем из обработки.

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Как работает функция merge()

Сообщение nickleb » 08 июл 2020, 08:11

Код: Выделить всё

B <- merge(x = B, 
           y = A, 
           by.x = "k", 
           by.y = "key")

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Как работает функция merge()

Сообщение VistaSV30 » 08 июл 2020, 09:31

nickleb, добрый день!
Основное назначение функции merge() - это слияние двух таблиц, при этом объединяются все столбцы таблиц.
Правильно я понимаю?
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Как работает функция merge()

Сообщение nickleb » 08 июл 2020, 10:45

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 попробовал... Сахар синтаксиса различных обёрток порой скрывает-растворяет соль сути решаемого...

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Как работает функция merge()

Сообщение VistaSV30 » 08 июл 2020, 11:17

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 поменялся.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

nickleb
Гуру
Сообщения: 964
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Как работает функция merge()

Сообщение nickleb » 08 июл 2020, 11:37

... если факторы как таковые не нужны, -
то при создании data.frame'ов
принудительно используйте опцию:
stringsAsFactors = FALSE
В Вашем случае:

Код: Выделить всё

A <- data.frame(key, dd, stringsAsFactors = FALSE)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Как работает функция merge()

Сообщение gamm » 08 июл 2020, 11:54

VistaSV30 писал(а):
08 июл 2020, 11:17
происходит
Потому, что слева в присваивании не факторы, я полагаю. Фактор хранится как номер уровня и внешнее представление уровня (вот номер и присвоился). При создании поля задайте фактор с соответствующими уровнями. А еще лучше используйте символьные строки, будет меньше проблем. Как это сделать, уважаемый nickleb написал.

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Как работает функция merge()

Сообщение VistaSV30 » 08 июл 2020, 14:49

Теперь работает как надо!
Спасибо коллеги!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя