left_join из пакета dplyr

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

left_join из пакета dplyr

Сообщение VistaSV30 » 30 апр 2020, 18:51

Добрый день!
Как присвоить значения по условию

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

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]

Подскажите, пожалуйста, как сделать?
Спасибо!
Последний раз редактировалось VistaSV30 30 июл 2020, 09:48, всего редактировалось 1 раз.
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

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

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

Сообщение nickleb » 01 май 2020, 08:16

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

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

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

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

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

Сообщение gamm » 01 май 2020, 10:38

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

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

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

Сообщение VistaSV30 » 14 май 2020, 10:50

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

Ответить

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

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

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