Определите последовательные события и объедините две фермы данных - PullRequest
5 голосов
/ 12 апреля 2020

Этот вопрос относится к вопросу, опубликованному ранее.

У меня есть 2 кадра данных, которые я хотел бы объединить. Два кадра данных имеют разные размеры (например, dim (df1) = 16533, 580 и dim(df2) = 2820, 675`).

Записи были сделаны в разные дни разными лицами / группами лиц.

Переменные от df1

  • Index = группа лиц, которые сделали запись (например, она может представлять 1 человек или 2 или подробнее)

  • id1 = человек из группы, который сделал запись (например, 12 1 = группа 12 person 1; 12 2 = group 12 person 2, etc.)

  • id2 = первый или второй день, когда была сделана запись (eg. 12 1 1 = group 12, person 1, 1 day; 12 1 2 = group 12, person 1, 2 day;)

  • Day = день недели, когда была сделана запись в дневнике (например, 12 1 1 Wednesday =group 12, person 1, day 1, weekday Wednesday; 12 1 2 Sunday = group 12, person 1, day 1 , weekday Sunday)

    За этими переменными следует 24h observations

obs1_1-obs1_144=primary observation obs2_1-obs2_144=secondary observations obs3_1-obs3_144=tertiary observations obs4_1-obs4_144=quarterly observations

Пример

df1

index id1 id2  Day           obs1_1...obs1_144....obs2_1...obs2_144...obs3_1...obs3_144...obs4_1...obs4_144
 12    1   1   Wednesday    1      11          12
 12    1   2   Sunday       2      0           0
123    1   1   Tuesday      1      0           1
123    1   2   Saturday     3      0           3
123    2   1   Monday       2      2           4
123    2   2   Saturday     1      0           8

В df2 наблюдения были записаны только на основе индекса и id1. На человека приходится только одно наблюдение. Точно так же здесь есть также переменная Day, которая записывает время начала записи (например, не день записи). Например, здесь id 12 1 Во вторник можно предположить, что группа 12 человек 1 начала записывать наблюдения со вторника.

Неделя делится на:

           Monday = 95 variables starting from day11-day196 
(in the actual data t0400_0415_d1-t0345_0400_d1)
            Tuesday = 95 variables starting day21-day296 
    (in the actual data t0400_0415_d2-t0345_0400_d2)
            Wednesday = 95 variables starting day31-day396
    (in the actual data t0400_0415_d3-t0345_0400_d3)
            Thursday = 95 variables starting day41-day496
    (in the actual data t0400_0415_d4-t0345_0400_d4)
            Friday = 95 variables starting day51-day596
    (in the actual data t0400_0415_d5-t0345_0400_d5)
            Saturday = 95 variables starting day61-day696
    (in the actual data t0400_0415_d6-t0345_0400_d6)
            Sunday = 95 variables starting day71-day796
    (in the actual data t0400_0415_d7-t0345_0400_d7)

Пример df2

index   id1  Day       day11 day12 day13 day14 day15 day16  day17  .....day196......day796
 12      1    Tuesday     2    1    2    1    1    3    1    
123      1    Friday      0    3    0    3    3    0    3  

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

Что я стремлюсь:

  1. df2 для идентификации последовательных записей (между ежедневными записями нет разрыва). Например, последовательная запись будет выглядеть следующим образом: запись началась во вторник, а записи есть в среду, четверг, пятницу. Это призыв как три последовательных записи. Непоследовательная запись была бы, если запись началась во вторник, и есть запись в среду и пятницу. Так как день перерыва это непоследовательная запись.

  2. df1 Я хотел бы указать индекс и id1 человека, который сделал последовательные записи, а также позицию записи в последовательном наблюдении (например, в 3-х последовательных наблюдениях наблюдение может приходиться на 1,2 или 3 дня) Пост, связанный с одним из моих вопросов

Результат:

 index id1 id2   obs1 obs2 obs3 
 12      1   1     1   11    12   
 12      1   2     2    0     0
 123     1   2     3    0     3        
 123     2   2     1    0     8

Пример данных

df1:

structure(list(index = c(12, 12, 123, 123, 123, 123), id1 = c(1, 
1, 1, 1, 2, 2), id2 = c(1, 2, 1, 2, 1, 2), Day = structure(c(5L, 
3L, 4L, 2L, 1L, 2L), .Label = c("Monday", "Saturday", "Sunday", 
"Tuesday", "Wednesday"), class = "factor"), obs1 = c(1, 2, 1, 
3, 2, 1), obs2 = c(11, 0, 0, 0, 2, 0), obs3 = c(12, 0, 1, 3, 
4, 8)), class = "data.frame", row.names = c(NA, -6L))

df2:

  structure(list(index = c(12, 123), id1 = c(1, 1), Day = structure(2:1, .Label = c("Friday", 
    "Tuesday"), class = "factor"), day1 = c(2, 0), day2 = c(1, 3), 
        day3 = c(2, 0), day4 = c(1, 3), day5 = c(1, 3), day6 = c(3, 
        0), day7 = c(1, 3)), class = "data.frame", row.names = c(NA, 
    -2L))

1 Ответ

1 голос
/ 12 апреля 2020

Мы можем сделать это с помощью Map, чтобы создать вектор ключ / значение named, а затем выполнить сопоставление с именами столбцов

lst1 <- Map(`:`, seq(11, 71, by = 10), seq(196, 796, by = 100))
names(lst1) <- c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
out <- stack(lst1)[2:1]
out$values <- paste0('day', out$values)

-checking

setNames(as.character(out$ind), out$values)[c('day41', 'day182', 'day242', 'day724')]
#   day41    day182    day242    day724 
# "Monday"  "Monday" "Tuesday"  "Sunday" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...