Страница 1 из 1

left_join из пакета dplyr

Добавлено: 30 апр 2020, 18:51
VistaSV30
Добрый день!
Как присвоить значения по условию

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

v1 <- c("cars", "cars1", "car", "car2")
v2 <- 1:4
vv <- data.frame(v1,v2)

v3 <- c("cars", "car")
v4 <- 10:11
vz <- data.frame(v3, v4)
Есть два data.frame - vv и vz
Надо vv$v2 присвоить значения vz$v4 по условию vv$v1 == vz$v3

Так не получается
vv$v2[vv$v1 == vz$v3] <- vz$v4[vv$v1 == vz$v3]

Подскажите, пожалуйста, как сделать?
Спасибо!

Re: Присвоить значения в фрэйме по условию

Добавлено: 01 май 2020, 08:16
nickleb
Здравствуйте.
М.б., дело в том, что при генерации Ваших data.frame'ов
не даёте опцию "stringsAsFactors = FALSE" ?
Попробуйте заменить строки кода создания data.frame'ов на:

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

vv <- data.frame(v1,v2, stringsAsFactors = FALSE)
vz <- data.frame(v3, v4, stringsAsFactors = FALSE)
и проверить получите ли, что хотели. - Сам я не проверял.

Re: Присвоить значения в фрэйме по условию

Добавлено: 01 май 2020, 10:38
gamm
VistaSV30 писал(а): 30 апр 2020, 18:51 vv$v1 == vz$v3
С точки зрения программы написана какая-то непонятная ерунда. Если нужно использовать vz как справочник для перекодировки значений в vv, то есть match(), merge() и прочие sqldf::sqldf().

Re: left_join из пакета dplyr

Добавлено: 14 май 2020, 10:50
VistaSV30
Проблема решена!
В пакете dplyr есть функция left_join() - работает как в SQL запрос на выборку с объединением

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

set.seed(1)
(A <- data.frame(a1=LETTERS[1:3], a2=sample(10:99,3), a3=sample(0:9,3), a4=sample(0:9,3)) )
B <- data.frame(b1=LETTERS[sample(1:3, 50,replace = T)], b2=sample(10:99,50)) 

library(dplyr)
left_join(B,A, by=c("b1"="a1")) # присоединяем все столбцы
left_join(B,select(A, a1,a2), by=c("b1"="a1")) # присоединяем один столбец
Присоединять можно и по двум ключам, синтаксис такой
left_join(B,A, by=c("b1"="a1","b2"="a2"))