У меня есть два фрейма данных:
#df1
df1 = data.frame(id = c("A","B","C","D","E"),
dev = c(213.5, 225.1, 198.9, 201.0, 266.8))
df1
id dev
1 A 213.5
2 B 225.1
3 C 198.9
4 D 201.0
5 E 266.8
#df2
df2 = data.frame(DateTime = seq(
from = as.POSIXct("1986-1-1 0:00"),
to = as.POSIXct("1986-1-2 23:00"),
by = "hour"),
cum_dd = seq(from = 185, to = 295, by = 2.3))
head(df2)
DateTime cum_dd
1 1986-01-01 00:00:00 185.0
2 1986-01-01 01:00:00 187.3
3 1986-01-01 02:00:00 189.6
4 1986-01-01 03:00:00 191.9
5 1986-01-01 04:00:00 194.2
6 1986-01-01 05:00:00 196.5
Я хотел бы создать новый столбец в df1, перечисляющий самый ранний df2 $ DateTime, в котором df2 $ cum_dd превышает df1 $ dev.
Вот мой желаемый результат:
id dev desired
1 A 213.5 1986-01-01 13:00:00
2 B 225.1 1986-01-01 18:00:00
3 C 198.9 1986-01-01 07:00:00
4 D 201.0 1986-01-01 07:00:00
5 E 266.8 1986-01-02 12:00:00
Я знаком с функцией min (which ()) в dplyr, которая при следующем форматировании возвращает номер первой строки в df2 взначение cum_dd выше 200:
library(dplyr)
min(which (df2$cum_dd > 200))
По сути, я хочу запустить эту функцию для каждой строки в df1 (заменив «200» на df1 $ dev) и найти / извлечь соответствующий df2 $ DateTimeзначение, а не номер строки.
Я думал, что с этим близко, но это не совсем правильно, и я не могу найти сравнимую проблему в переполнении стека:
desired <- apply(df1, 1,
function (x) {ddply(df2, .(DateTime), summarize,
min(which (df2$cum_dd > df1$dev)))})
Большое спасибо, если у вас есть решение!