Объединение наборов данных на основе идентификаторов групп - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть 2 набора данных с 2 различными типами наблюдений. Наблюдения проводились в разные дни, и они записывались в разные промежутки времени.

Обе записи имеют серийный номер, который используется для идентификации группы людей, проводивших наблюдения. Например, серийный номер 111 обозначает группу людей. Эта группа состоит из разного количества людей. Количество людей, принадлежащих к этим группам, варьируется. Например, группа 111 состоит из 3 человек. В дневниках мы можем идентифицировать людей, принадлежащих к разным группам, по переменным serial и id1. Например, serial 111 and id1 2 означает, что наблюдение было сделано человеком номер два из группы 111. Существует также переменная Day, которая обозначает день недели, когда проводилось наблюдение. Переменная Day принимает значения от 1(Monday) to 7 (Sunday).

Если в df1 у нас есть 1 наблюдение на человека в df2, то каждый человек должен был провести 2 наблюдения. Человек, который сделал наблюдение, может быть идентифицирован на основании serial, id1 and id2. Id2 используется для определения различий между наблюдениями дня недели. Например, id 111, id1 3 и id2 2 можно интерпретировать как 2-дневное наблюдение, проведенное человеком № 2 из группы 111. День недели наблюдения аналогичным образом сохраняется с помощью переменной Day.

Я хочу идентифицировать тех людей, которые записали информацию в один и тот же день в обоих дневниках. Итак, кто эти люди, которые заполнили обе записи в один и тот же день. Проблема в том, что в df2 есть 2 наблюдения, а в df1 только по одному на человека, и это затрудняет слияние.

Я слился на основе serial and id1, но они не являются уникальными идентификаторами. Я попытался создать новую переменную и выполнить слияние на уровне «День».

Как объединить 2 набора данных на уровне дня?

library(dplyr)

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 апреля 2020

Вы можете добавить соответствующее значение id2 от df2 до df1 с помощью объединения обновлений, используя data.table

library(data.table)
setDT(df1)
setDT(df2)

df1[df2, id2 := i.id2, on = .(serial, id1, Day)]

df1
#    serial id1 Day id2
# 1:     12   1   1   1
# 2:    123   1   3   1
# 3:    123   2   2   1
# 4:     10   1   4   1
# 5:     10   2   2   1
2 голосов
/ 15 апреля 2020

Вы можете попробовать merge, как показано ниже

merge(df1,df2,all.x = T)[1:4]

, например,

> merge(df1,df2,all.x = T)[1:4]
  serial id1 Day id2
1     10   1   4   1
2     10   2   2   1
3     12   1   1   1
4    123   1   3   1
5    123   2   2   1
1 голос
/ 15 апреля 2020

Используйте слияние: out <- merge(d1, d2, by = c('serial', 'id1')) , а затем выберите серийные столбцы, id1, id2, Day

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