【问题标题】:R - Using an if else statement to categorise sickness type based on the number of days off?R - 使用 if else 语句根据休息天数对疾病类型进行分类?
【发布时间】:2016-12-12 12:44:07
【问题描述】:

我目前正在尝试找出公司中有多少人在过去一年中连续 5 天休假 3 天。

下面列出了以下虚假数据作为示例:

structure(list(Region = c("20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", 
"20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", 
"20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX", 
"20SUSSX", "20SUSSX", "20SUSSX", "20SUSSX"), On_date = structure(c(16122, 
16123, 16127, 16128, 16129, 16130, 16132, 16133, 16134, 16135, 
16279, 16280, 16281, 16282, 16286, 16287, 16290, 16291, 16444, 
16458), class = "Date"), Name = c("bob", "bob", "bob", "bob", 
"bob", "bob", "bob", "bob", "bob", "bob", "bob", "bob", "bob", 
"bob", "bob", "bob", "bob", "bob", "bob", "bob"), Sickness_Type = c("?", 
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", 
"?", "?", "?", "?", "?", "?")), .Names = c("Region", "On_date", 
"Name", "Sickness_Type"), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

使用此数据框,我的目标是在“Sickness_Type”变量中使用 if else 语句,如果前 5 天中有 3 天出现疾病,则输入 1,如果发生频率低于此值,则输入 0 .一行仅出现在生病的员工身上。

由于我不熟悉 R 中的日期格式,我不确定如何执行此操作。目前我一直在尝试使用 dplyr 的 mutate 和 if_else 但没有运气。

对此的任何帮助将不胜感激,

谢谢!

【问题讨论】:

  • 疾病如何识别?
  • “前 5 天”是指连续天数?即 21/02、22/02、26/02 考虑 3 天还是 6 天?
  • 不确定我是否得到它。你能提供所需的输出吗?我的第一个猜测是这样的:seq_along(df$On_date)-findInterval(df$On_date-5.1,df$On_date)>=3
  • @George 指出一个应该归类为疾病的实例以及不属于疾病的实例对您很有帮助。
  • 但它没有考虑日历日期...只是出现在数据框上的日期

标签: r if-statement dplyr


【解决方案1】:

我相信你可以使用 dplyr 的lag function 来实现这一点,例如:

dat %>% 
    group_by(Name) %>% 
    arrange(On_date) %>%
    mutate(Sickness_Type=ifelse(On_date - lag(On_date, 3) <= 5, 1, 0))

lag(On_date, 3) 检索在当前条目之前的第三个条目的日期,因此如果该日期小于或等于五,则您知道在该时间范围内有三种疾病。

结果是:

    Region    On_date  Name Sickness_Type
     <chr>     <date> <chr>         <dbl>
1  20SUSSX 2014-02-21   bob            NA
2  20SUSSX 2014-02-22   bob            NA
3  20SUSSX 2014-02-26   bob            NA
4  20SUSSX 2014-02-27   bob             0
5  20SUSSX 2014-02-28   bob             0
6  20SUSSX 2014-03-01   bob             1
7  20SUSSX 2014-03-03   bob             1
8  20SUSSX 2014-03-04   bob             1
9  20SUSSX 2014-03-05   bob             1
10 20SUSSX 2014-03-06   bob             1
11 20SUSSX 2014-07-28   bob             0
12 20SUSSX 2014-07-29   bob             0
13 20SUSSX 2014-07-30   bob             0
14 20SUSSX 2014-07-31   bob             1
15 20SUSSX 2014-08-04   bob             0
16 20SUSSX 2014-08-05   bob             0
17 20SUSSX 2014-08-08   bob             0
18 20SUSSX 2014-08-09   bob             1
19 20SUSSX 2015-01-09   bob             0
20 20SUSSX 2015-01-23   bob             0

显然,您将需要处理前几天没有那么多的情况,从而导致 NA。

一种直接的方法是添加第二个嵌套的ifelse 语句和is.na()

【讨论】:

  • 您不需要(至少)按Name 列分组吗?
  • 是的,我会按Name 分组并按On_date 进行安排,以确保。我还认为当天应该计入总数。仍然是一个非常优雅的解决方案。我尝试使用rollapply 滑动窗口方法,但处理时间框架开始的代码变得比这复杂得多。
  • 好建议!我将 sn-p 更新为按Name 分组并按On_date 排序。
猜你喜欢
  • 2018-07-24
  • 1970-01-01
  • 2020-11-17
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多