#r #dplyr
#r #dplyr
Вопрос:
Рассмотрим эти два фрейма данных:
t1<-data.frame(Time=1:3,Cat=rep("A",3),SomeValue=rep("t1",3))
t2<-data.frame(Time=c(1,2,3,1,3),Cat=rep("A",5),Id=c(1,1,1,2,2),SomeOtherValue=c(1,2,3,4,5))
В моем приложении мне нужно выполнить полное объединение и поработать с отсутствующими записями / значениями. Выполнение частичного full_join для подмножеств (группировка переменных) работает, но я теряю свои недостающие значения, когда пробую нефильтрованный подход.
Это даст мне 6 записей
t2 %>% group_by(Id) %>% filter(Id==2) %>% full_join(t1,by=c("Time","Cat"))
t2 %>% group_by(Id) %>% filter(Id==1) %>% full_join(t1,by=c("Time","Cat"))
Это даст мне 5, где отсутствует запись (значения NA) Id == 2 и Time == 2:
t2 %>% group_by(Id) %>% full_join(t1,by=c("Time","Cat"))
Я понимаю group_by так, что он группируется по переменным и продолжается со всеми моими последующими мутациями, отображениями и т.д. В каждой группе. Предполагается ли, что это должно вести себя таким образом?
Комментарии:
1.
group_by
проблема не в этом. У вас получилось 5 строк, потому что вы объединяетесь на основеTime
иCat
. Вы можете видеть этоt2 %>% group_by(Id) %>% full_join(t1,by=c("Time","Cat"))
иt2 %>% full_join(t1,by=c("Time","Cat"))
выдавать тот же результат2. В
t2 %>% group_by(Id) %>% filter(Id==2) %>% full_join(t1,by=c("Time","Cat"))
вы получили пропущенные значения, потому что после использования, котороеfilter
вы фактически подмножествовалиt1
, это приводит к совершенно другому фрейму данных3. Я этого не понимаю. Не могли бы вы пояснить, что вы подразумеваете под утверждением, что я ввел подмножество ‘t1’ . Если я сделаю то же самое в SQL, я получу 6 записей.
4.
t2 %>% group_by(Id) %>% filter(Id==2)
илиt2 %>% group_by(Id) %>% filter(Id==1)
иt1
различны. Вы не должны ожидать того же результата после полного) объединения их сt2
5. В какой момент я заменил t1? Я явно установил подмножество t2 с помощью фильтрации. Я хочу сказать, что объединение двух соединений (то есть двух выходных данных) не составляет нефильтрованное. Я ожидал этого. Действительно, они разные, в этом весь смысл. Мне нужно все из t1 и все из t2. full_join: возвращает все строки и все столбцы как из x, так и из y. Там, где нет совпадающих значений, возвращает NA для одного отсутствующего.
Ответ №1:
После правильного прочтения документации я, наконец, нашел раздел, в котором говорится, что группы игнорируются с целью объединения. ?full_join
Комментарии:
1. Хорошая работа по ее решению! Это происходит со мной постоянно после того, как я разместил здесь — я лихорадочно пытаюсь найти ответ, прежде чем это сделает остальной мир.