Объединение фреймов данных и создание столбцов на основе условий - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 2 фрейма данных

Фрейм данных A:

Time Reading
1      20 
2      23
3      25
4      22
5      24
6      23 
7      24
8      23
9      23
10     22

Фрейм данных B:

TimeStart TimeEnd Alarm
 2            5     556
 7            9     556

Я хотел бы создать следующий объединенный фрейм данных:

Time Reading Alarmtime Alarm alarmno 
 1    20        n/a     n/a    n/a
 2    23         2      556     1
 3    25                556     1
 4    22                556     1 
 5    24         5      556     1
 6    23         n/a    n/a     n/a
 7    24         7      556     2
 8    23                556     2
 9    23         9      556     2
 10   22         n/a    n/a     n/a

Я могу сделать соединение достаточно легко, однако я изо всех сил стараюсь заполнить следующие строки сигналом тревоги до тех пор, пока сигнал не закончится.Также нумерация каждого отдельного будильника, поэтому, даже если это один и тот же будильник, они учитываются отдельно.Любые мысли о том, как я могу сделать это было бы здорово

Спасибо

1 Ответ

0 голосов
/ 27 ноября 2018
library(sqldf)

df_b$AlarmNo <- seq_len(nrow(df_b))

sqldf('
select  a.Time
        , a.Reading
        , case  when a.Time in (b.TimeStart, b.TimeEnd)
                  then a.Time
                else NULL
        end as AlarmTime
        , b.Alarm
        , b.AlarmNo
from    df_a a
        left join df_b b
          on a.Time between b.TimeStart and b.TimeEnd
')

#    Time Reading AlarmTime Alarm AlarmNo
# 1     1      20        NA    NA      NA
# 2     2      23         2   556       1
# 3     3      25        NA   556       1
# 4     4      22        NA   556       1
# 5     5      24         5   556       1
# 6     6      23        NA    NA      NA
# 7     7      24         7   556       2
# 8     8      23        NA   556       2
# 9     9      23         9   556       2
# 10   10      22        NA    NA      NA

Или

library(data.table)
setDT(df_b)

df_c <- 
  df_b[, .(Time = seq(TimeStart, TimeEnd), Alarm, AlarmNo = .GRP)
       , by = TimeStart]

merge(df_a, df_c, by = 'Time', all.x = T)

#     Time Reading TimeStart Alarm AlarmNo
#  1:    1      20        NA    NA      NA
#  2:    2      23         2   556       1
#  3:    3      25         2   556       1
#  4:    4      22         2   556       1
#  5:    5      24         2   556       1
#  6:    6      23        NA    NA      NA
#  7:    7      24         7   556       2
#  8:    8      23         7   556       2
#  9:    9      23         7   556       2
# 10:   10      22        NA    NA      NA

Используемые данные:

df_a <- fread('
Time Reading
1      20 
2      23
3      25
4      22
5      24
6      23 
7      24
8      23
9      23
10     22
')

df_b <- fread('
TimeStart TimeEnd Alarm
 2            5     556
 7            9     556
')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...