【问题标题】:Pivot table in R with a column for each hour of the dayR中的数据透视表,一天中的每个小时都有一列
【发布时间】:2020-03-26 19:17:08
【问题描述】:

我正在尝试在 R 中重新创建一个数据透视表,我通常在 Excel 中创建。

原始数据看起来像这样,除了数千行(去识别):

ORDER_ID        ACT_DATE    ACT_TIME    ACT_TYPE                                    NURSE_UNIT  FACILITY_AREA   USER_NAME                                                    
111 2/28/2020   12:04   MODIFY                                      BG RCU      BGMC            User 1
112 2/27/2020   17:50   MODIFY                                      BG CCU E    BGMC            User 2                                           
113 2/27/2020   17:50   MODIFY                                      BG CCU E    BGMC            User 2                                           
114 2/27/2020   14:31   CANCEL/DC                                   BG CCU E    BGMC            User 2                                           
115 2/28/2020   6:03    CANCEL/DC                                   BG CCU E    BGMC            User 2                                           
116 2/28/2020   6:03    CANCEL/DC                                   BG CCU E    BGMC            User 2                                           
117 2/28/2020   10:29   CANCEL/DC                                   BG CCU E    BGMC            User 2                                           
118 2/28/2020   9:20    MODIFY                                      BG CCU E    BGMC            User 3                                                  
119 2/24/2020   12:43   VERIFY                                      BG 5 Sou    BGMC            User 4                                                 
110 2/26/2020   9:08    CANCEL/DC                                   BG 6 Sou    BGMC            User 5                                                  
111 2/27/2020   17:50   MODIFY                                      BG CCU E    BGMC            User 2                                           
112 2/28/2020   5:57    CANCEL/DC                                   BG CCU E    BGMC            User 2                                           

源代码:

library(dplyr)

bgmcOrderAction <- read.csv('C:\\Users\\xxx\\Desktop\\bgmc_order_action_report_20200223.csv')

# filter the data
byUnit <- bgmcOrderAction %>%
  # remove this strange extra column
  select(-c(X)) %>%

  #remove extra white space
  mutate(USER_NAME = trimws(USER_NAME)) %>%
  mutate(ACT_TYPE = trimws(ACT_TYPE)) %>%
  mutate(ACT_TIME = trimws(ACT_TIME)) %>%
  mutate(NURSE_UNIT = trimws(NURSE_UNIT)) %>%
  mutate(FACILITY_AREA = trimws(FACILITY_AREA)) %>%

  # convert the time from HH:MM to just HH
  mutate(ACT_HR = substr(ACT_TIME, 1, 2)) %>%

  # we're interested in the quantity of order actions in each nurse unit per hour
  group_by(NURSE_UNIT, ACT_HR) %>%

  #mutate(count = n()) %>%
  summarise(ACT_COUNT = n())
byUnit

NURSE_UNIT:护士单位描述
ACT_HR:动作发生的小时
ACT_COUNT:每个唯一事件的汇总计数

> byUnit
# A tibble: 688 x 3
# Groups:   NURSE_UNIT [36]
   NURSE_UNIT ACT_HR ACT_COUNT
   <chr>      <chr>      <int>
 1 BG 2 Sou   01            15
 2 BG 2 Sou   09             2
 3 BG 2 Sou   12            16
 4 BG 2 Sou   15            15
 5 BG 2 Sou   17            29
 6 BG 2 Sou   18            44
 7 BG 2 Sou   19            14
 8 BG 2 Sou   20            16
 9 BG 2 Sou   21            43
10 BG 2 Sou   22            30
# ... with 678 more rows

我想要的输出看起来像这样(基本上是热图类型的布局),其中行标签是每个护士单位只有一次,而列标签是一天中的每个小时(军事时间)只有一次。表中的数字代表该特定护士单位在该特定时间的 ACT_COUNT。目标是了解每个护士单位一天中每个小时发生了多少行动。

示例输出:

          0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23
Unit1     0  1  5  0  7  1  0  0  0  0  0   0   0   2   0   1   8   9   0   0   3   4   5   1
Unit2     0  0  1  0  2  1  0  0  0  0  0   6   0   0   4   0   8   0   0   0   3   0   2   0
Unit3     0  1  2  0  4  1  0  0  0  0  0   0   0   2   0   1   0   9   3   0   3   4   1   1
Unit4     0  1  0  0  1  1  0  0  0  0  0   0   0   0   4   1   8   9   0   0   0   4   1   1
BG 2 Sou  0  15 0  0  0  0  0  0  0  2  0   0   16  0   0   15  0   29  44  0   0   0   0   0

【问题讨论】:

  • 如果你制作了一个可重现的例子会更容易一些,但我认为你可以简单地使用:tapply(byUnitHour$ACT_COUNT,byUnitHour[,1:2],sum) 让我知道这是否符合你的需要,我可以正式给出答案。跨度>
  • 这行得通。我将解决这个问题以使这一点更清楚。谢谢!
  • 谢谢。 FWIW,如果您获取数据的标题 (ex.data&lt;-byUnit[1:25,]),然后使用 dput 函数,R 将输出一个脚本,允许我们重新创建您的前 25 行。然后我们有一张看起来像你的桌子。 dput(ex.data) 这可以帮助人们在发布之前测试代码并重新创建您可能遇到的任何错误。

标签: r time pivot-table


【解决方案1】:

tapplyby(我相信这是一个 tapply 包装器)都应该完成这项工作。我认为还有其他一些方法。如果您想要一个包含所有总数的数据框,您可能只能在 tidyverse 中 summarize()

无论如何,如果您要在矩阵中列出一些数量总和 (ACT_COUNT),其中列名是 ACT_HR,行名是 UNIT。这是使用tapply时的样子

tapply(byUnitHour$ACT_COUNT, byUnitHour[,1:2], sum)

享受吧!

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多