Как создать новый столбец в кадре данных, основываясь на диапазонах в пределах факторов от другого, в R - PullRequest
0 голосов
/ 22 сентября 2018

Это немного сложная проблема, которую я пытаюсь решить в R (R-Studio, R версия 3.3.1).

У меня есть два кадра данных (DF_A, DF_B).DF_A имеет такую ​​структуру:

Filename   Timestamp
A          11
A          12
A          17 
B          18
B          22
B          23
C          24
C          28
C          30

И, DF_B, как это:

Timestamp
11
12
13
14
15
16
17 
18 
19
...
30 

И я хотел бы иметь возможность переместить имя файла из DF_A в DF_B, основываясь надиапазон значений, видимых в каждом факторе имени файла от DF_A.Итак:

Timestamp   Filename 
11          A
12          A
13          A
14          A
...
18          B
19          B
...
24          C

Я рассматривал получение минимально-максимальной отметки времени каждого фактора в DF_A, добавляя имя файла, поскольку они принадлежат тому же диапазону отметок времени в DF_B.Таким образом, мне удалось получить минимальное-максимальное по найденному мною решению, которое превращает информационный фрейм в таблицу данных и получает минимальное / максимальное для каждого фактора:

DT_A <- as.data.table(DF_A)
DT[,.SD[which.min(Timestamp)], by = Filename]
DT[,.SD[which.max(Timestamp)], by = Filename]

Увы, это так далекокак я получил.Я не уверен, как бы я применил это к DF_B.Решение может быть довольно открытым здесь.Любопытно увидеть разные решения.Любая помощь очень ценится.Спасибо!

1 Ответ

0 голосов
/ 22 сентября 2018
# import the necessary package
library(data.table)

# create lookup data table
DT_A <- data.table(
  Filename = rep(c("A", "B", "C"), each = 3),
  Timestamp = c(11, 12, 17, 18, 22, 23, 24, 28, 30)
)

# form data table to be labelled
DT_B <- data.table(
  Timestamp = 11:30
)

# get the minimum and maximum timestamp for each filename
DT_limits <- DT_A[ , 
  .(from = min(Timestamp, na.rm = T),
    to = max(Timestamp, na.rm = T)),
  by = Filename]

## apply a fast overlap
DT_B[ , dummy:= Timestamp]
setkey(DT_limits, from, to)
DT_final <- foverlaps(
  DT_B,
  DT_limits,
  by.x = c("Timestamp", "dummy"),
  nomatch = 0L
)[ , c("from", "to", "dummy") := NULL]

DT_final
# Filename Timestamp
# 1:        A        11
# 2:        A        12
# 3:        A        13
# 4:        A        14
# ...
# 8:        B        18
# 9:        B        19
# ...
# 14:       C        24
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...