【问题标题】:Get the min and max-value of a period by group按组获取周期的最小值和最大值
【发布时间】:2023-03-20 07:01:01
【问题描述】:

我在每个小组中都有一些时间让参与者喝一些水(1 = 年轻人,2 = 成人)。不幸的是,我想不出一个很好的方法来区分 min(time) 和 max(time) 之间的差异。青少年为 21 小时,成人为 6 小时。这显然不起作用:

age <-c(1,1,2,1,2) 
time <-hm("22:00","01:00","12:00","16:00","18:00")
drink <- data.frame(age, time)
diff <- drink %>% group_by(age) %>% summarise(max()-min()) 

【问题讨论】:

  • time 是什么意思?是参与者喝水的时间还是喝水的时间?
  • 首先,这应该是time &lt;- hm("22:00","01:00","12:00","16:00","18:00") ; food &lt;- data.frame(sex, time)。 (您需要将时间放在引号中,否则您将在数字上运行`:`,并且您还需要定义food),其次,您可能应该使用summarise(max(time)-min(time))(例如,您需要插入一些值转换为min/max)。
  • 另外,min/max 似乎不知道如何处理此类,您可能需要在定义 time 时自己提取小时,例如time &lt;- hm("22:00","01:00","12:00","16:00","18:00")@hour
  • 此外,如果您将摘要命名为summarise(rng=max(time)-min(time)),您可能会发现更容易显示结果,否则列名将是表达式本身(通常不需要)。
  • 可能是 OP 应该使用time_length 来计算minmax 之间的差异。即food %&gt;% group_by(sex) %&gt;% summarise(gap = (max(time_length(time))-min(time_length(time))))

标签: r dplyr lubridate


【解决方案1】:

使用lubridate 中的time_length 函数可以实现一个解决方案。

library(lubridate)

#data
sex <-c(1,1,2,1,2) 
time <-hm(c("22:00","01:00","12:00","16:00","18:00"))
food <- data.frame(sex, time)


food %>% mutate(tl_sec = time_length(time)) %>% 
  group_by(sex) %>% summarise(diff_secs = max(tl_sec) - min(tl_sec)) %>%
  as.data.frame()

#    sex diff_secs
# 1   1     75600
# 2   2     21600


#Diff in HRS
food %>% mutate(tl_sec = time_length(time)) %>% 
  group_by(sex) %>% summarise(diff_hrs = (max(tl_sec) - min(tl_sec))/3600) %>%
  as.data.frame()

#     sex diff_hrs
# 1   1       21
# 2   2        6

【讨论】:

  • 如果时间变量中有一些 NA,我应该使用 na.rm=TRUE 吗?还是有更好的办法?
  • @RobinRosine 显然你必须使用na.rm = TRUE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2011-08-16
  • 2017-12-13
相关资源
最近更新 更多