Посмотрите и извлеките значения, превышающие пороговое значение в r - PullRequest
0 голосов
/ 24 августа 2018

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

#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)))}) 

Большое спасибо, если у вас есть решение!

Ответы [ 2 ]

0 голосов
/ 25 августа 2018
library(tidyverse)
df1 = data.frame("id" = c("A","B","C","D","E"), "dev" = c(213.5, 225.1, 198.9, 201.0, 266.8))

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)) 

df2 %>% 
  crossing(df1) %>% 
  filter(cum_dd > dev) %>% 
  arrange(DateTime, desc(cum_dd)) %>% 
  group_by(id) %>% 
  distinct(id, .keep_all = T)
0 голосов
/ 24 августа 2018
# example datasets
df1 = data.frame(id = c("A","B","C","D","E"), 
                 dev = c(213.5, 225.1, 198.9, 201.0, 266.8))

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)) 

library(tidyverse)

df1 %>% 
  crossing(df2) %>%         # get all combinations of rows
  group_by(id, dev) %>%     # for each id and dev
  summarise(desired = min(DateTime[cum_dd > dev])) %>%  # get minimum date when cumm_dd exeeds dev
  ungroup()                 # forget the grouping

# # A tibble: 5 x 3
#   id      dev desired            
#   <fct> <dbl> <dttm>             
# 1 A      214. 1986-01-01 13:00:00
# 2 B      225. 1986-01-01 18:00:00
# 3 C      199. 1986-01-01 07:00:00
# 4 D      201  1986-01-01 07:00:00
# 5 E      267. 1986-01-02 12:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...