Страница 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
				Теперь работает как надо!
Спасибо коллеги!