Basi c вопрос о слиянии двух фреймов данных на основе разных переменных - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть два разных data.frames с diff. размеры.

dim(df1) = 2942 obs.    6 var.
dim(df2)= 16533 obs. 2307 var.

Я хотел бы объединить df1 с df2 с целью df3 with 2942 observations.

Следующие переменные определяют наблюдения в кадрах данных: serial (group indetification number), id1 (person identifier from the group ranges from 1 to number of people in the group), Day (the week day when the record was made). Переменная дня определяется как: Mon.:1; Tue.:2; Wed.:3, Thur.:4, Fri.:5, Sat.:6, Sun.:7

В df2 есть 2 наблюдения для одного и того же serial. Я хотел бы иметь df с сериалами и id1s' на уровне Day. Поэтому в основном я создаю новый индекс переменной для df1 и df2

library(dplyr)

df1<-df1 %>% 
      mutate(index = group_indices_(df1, .dots=c("serial", "id1", "id2"))) 


df2<-df2 %>% 
      mutate(index = group_indices_(df2, .dots=c("serial", "id1"))) 

Пожалуйста, посмотрите пример данных.

Я использовал приведенный выше код для слияния:

library(dplyr)
df3<-inner_join(df1,df2,by=c("index","Day"),suffix=c(".df1",".df2"))

.. и я получаю df3 with 65 obs. and 2310 var., а не 2942 obs and 2310 var.

Может кто-нибудь объяснить, почему у меня есть эта проблема?

Дата выборки:

df1

structure(list(serial = c(12, 123, 123, 10, 10), id1 = c(1, 1, 
2, 1, 2), Day = c(1, 3, 2, 4, 2)), class = "data.frame", row.names = c(NA, 
-5L))

df2

structure(list(serial = c(12, 12, 123, 123, 123, 123, 10, 10, 
10, 10, 10, 10), id1 = c(1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 3, 3), 
    id2 = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Day = c(1, 6, 
    3, 7, 2, 7, 4, 7, 2, 7, 4, 7), index = c(7L, 8L, 9L, 10L, 
    11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA, -12L
), class = "data.frame")

Пример выборки данных:

serial id1 id2 Day
12      1   1   1
123     1   1   3
123     2   1   2
10      1   1   4
10      2   1   2

1 Ответ

2 голосов
/ 14 апреля 2020

На основании количества наблюдений, которые вы запрашиваете, я предполагаю, что вы хотите сохранить все наблюдения от df1. Вы также сказали, что наблюдения были однозначно идентифицированы по серийному номеру, id1, id2 и Day. Я бы попробовал левое объединение:

left_join(df1,df2,by=c("serial","id1","Day"),suffix=c(".df1",".df2"))

Наблюдения из df1 без совпадения в df2 будут иметь NA во вновь добавленных столбцах.

Правильное объединение приведет к тому, что все наблюдения будут df2 и избавьтесь от несовпадающих из df1, что кажется противоположностью того, что вы пытаетесь сделать.

Согласно документации:

left_join ()

возвращает все строки из x и все столбцы из x и y. Строки в x без совпадения по y будут иметь значения NA в новых столбцах. Если между x и y есть несколько совпадений, возвращаются все комбинации совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...