【问题标题】:Sum if the date difference is smaller than a value如果日期差小于某个值,则求和
【发布时间】:2017-10-13 12:40:26
【问题描述】:

我有一个数据库,其中包含一系列机器的错误寄存器及其对应日期。有几种错误。即:

initial data table

          fechayhora        id tipo
1: 2017-03-21 11:03:00 A2_LR1_Z1  APF
2: 2017-05-03 10:34:00 A2_LR1_Z1  APF
3: 2017-05-17 08:52:00 A2_LR1_Z1  APF
4: 2017-05-17 10:46:00 A2_LR1_Z1  APF
5: 2017-05-17 14:23:00 A2_LR1_Z1  APF
6: 2017-05-17 17:29:00 A2_LR1_Z1  APF

我想添加一列,其中包含之前发生的事件的总和,例如 12 小时(实际上我可以改变的参数)。

预期结果:

          fechayhora        id tipo    number_of_APF_12h
1: 2017-03-21 11:03:00 A2_LR1_Z1  APF  0
2: 2017-05-03 10:34:00 A2_LR1_Z1  APF  0
3: 2017-05-17 08:52:00 A2_LR1_Z1  APF  0
4: 2017-05-17 10:46:00 A2_LR1_Z1  APF  1
5: 2017-05-17 14:23:00 A2_LR1_Z1  APF  2
6: 2017-05-17 17:29:00 A2_LR1_Z1  APF  3 

【问题讨论】:

  • 这里的人们会希望看到一些代码表明您已经自己尝试过。
  • 你好@jdv 这是我写的第一篇文章,实际上我正在学习 R 编程;我不知道发布问题的程序是什么,不是因为我没有尝试过并不意味着我以前没有尝试过,但是我不知道如何去做,这就是我写这篇文章的原因.如果这让你很困扰,最好不要回答。
  • 也许您不知道 StackOverflow 要求成员审查新问题并为新用户提供帮助,以帮助他们了解如何最好地使用该网站。这个想法是为了帮助您创建一个更有可能吸引好的答案的问题,并在未来对其他人有用。通常,您应该先尝试自己解决问题。我建议您查看以下参考资料:stackoverflow.com/help/how-to-ask,尤其是stackoverflow.com/help/mcve

标签: r dataframe time


【解决方案1】:

这是一个利用purrr::map2_dbl() 的解决方案。您可以随意更改小时数。


suppressPackageStartupMessages(library(tibble))
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(purrr))
suppressPackageStartupMessages(library(lubridate))

# Example data
df <- tribble(
  ~fechayhora,        ~id,       ~tipo,
  "2017-03-21 11:03:00", "A2_LR1_Z1",  "APF",
  "2017-05-03 10:34:00", "A2_LR1_Z1",  "APF",
  "2017-05-17 08:52:00", "A2_LR1_Z1",  "APF",
  "2017-05-17 10:46:00", "A2_LR1_Z1",  "APF",
  "2017-05-17 14:23:00", "A2_LR1_Z1",  "APF",
  "2017-05-17 17:29:00", "A2_LR1_Z1",  "APF"
)

# Convert fechayhora to date and add a column of the time difference
df <- df %>%
  mutate(fechayhora = as.POSIXct(fechayhora),
         minus_12   = fechayhora - hours(12))

# Map over fechayhora and minus_12
# For each (fechayhora, minus_12) pair, find all the dates between them
# and sum the logical vector that is returned
df <- df %>% mutate(
  number_of_APF_12h = map2_dbl(.x = fechayhora, 
                               .y = minus_12, 
                               .f = ~sum(between(df$fechayhora, .y, .x)) - 1))

df %>%
  select(fechayhora, number_of_APF_12h)
#> # A tibble: 6 x 2
#>            fechayhora number_of_APF_12h
#>                <dttm>             <dbl>
#> 1 2017-03-21 11:03:00                 0
#> 2 2017-05-03 10:34:00                 0
#> 3 2017-05-17 08:52:00                 0
#> 4 2017-05-17 10:46:00                 1
#> 5 2017-05-17 14:23:00                 2
#> 6 2017-05-17 17:29:00                 3

【讨论】:

  • 你好戴维斯沃恩!这是完美的:) 现在我尝试以下没有任何成功(按 id 和机器类型分组): df2 % group_by(id,tipo) %>% mutate( number_of_APF_12h = map2_dbl(.x = fechayhora , .y = minus_12, .f = ~sum(between(df2$fechayhora, .y, .x)) - 1))%>% ungroup()
  • 或相同,尝试使用 data.table: df=as.data.table(df) df[,x:= map2_dbl(.x = fechayhora,.y = minus_12,.f = ~总和(介于(df$fechayhora, .y, .x)) - 1),by=id]
  • @Martu,因为这个人基本上为你做了所有的努力,你应该把它标记为“最佳”或“接受”的答案。见这里:stackoverflow.com/help/accepted-answer
  • 其实我是这样做的,但是页面是因为我没有 15 名声望它“不能改变任何东西”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多