R group_by %>% full_join теряет записи NA

#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. Хорошая работа по ее решению! Это происходит со мной постоянно после того, как я разместил здесь — я лихорадочно пытаюсь найти ответ, прежде чем это сделает остальной мир.