【问题标题】:Count on each group matching the criteria R [duplicate]依靠与标准 R 匹配的每个组 [重复]
【发布时间】:2016-11-14 05:35:39
【问题描述】:

我有以下数据集,我试图根据 SwitchedOnDate 查找每台机器处于活动状态和处于睡眠模式的天数。

 MachineID InstalledDate SwitchedOnDate Status
 1           2010-02-18    2010-02-19    SleepMode
 1           2010-02-18    2010-02-20    Active
 1           2010-02-18    2010-02-21    SleepMode
 1           2010-02-18    2010-02-22    Active
 2           2010-02-20    2010-02-21    Active
 2           2010-02-20    2010-02-22    SleepMode
 3           2010-02-10    2010-02-18    SleepMode
 4           2010-03-10    2010-03-15    Active

所以我的输出应该是这样的,

MachineID SleepModeDays ActiveDays
1          2             2
2          1             1
3          1             0
4          0             1

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    您可以使用count 对您传递的最后一个变量的每个级别的出现次数进行分组和计数,然后使用spread 将数据重新排列为宽格式:

    library(tidyverse)
    
    df %>% count(MachineID, Status) %>% spread(Status, n, fill = 0L)
    
    ## Source: local data frame [4 x 3]
    ## Groups: MachineID [4]
    ## 
    ##   MachineID Active SleepMode
    ## *     <int>  <int>     <int>
    ## 1         1      2         2
    ## 2         2      1         1
    ## 3         3      0         1
    ## 4         4      1         0
    

    一个基本的 R 替代方案:

    tab <- table(df$MachineID, df$Status)
    
    data.frame(MachineID = rownames(tab), as.data.frame.matrix(tab))
    
    ##   MachineID Active SleepMode
    ## 1         1      2         2
    ## 2         2      1         1
    ## 3         3      0         1
    ## 4         4      1         0
    

    或者对于一个非常直接的路线,

    janitor::crosstab(df, MachineID, Status)
    
    ##   MachineID Active SleepMode
    ## 1         1      2         2
    ## 2         2      1         1
    ## 3         3      0         1
    ## 4         4      1         0
    

    请注意,这些方法做了一些假设,例如您不能多次出现 MachineID、SwitchedOnDate 和 Status 的相同组合。如果您的数据变得更复杂,请考虑此类情况。

    【讨论】:

      【解决方案2】:

      使用 data.table 进行聚合和 dcast 功能,这是另一种解决方案:

      library(data.table)
      data <-  "MachineID InstalledDate SwitchedOnDate Status
       1           2010-02-18    2010-02-19    SleepMode
       1           2010-02-18    2010-02-20    Active
       1           2010-02-18    2010-02-21    SleepMode
       1           2010-02-18    2010-02-22    Active
       2           2010-02-20    2010-02-21    Active
       2           2010-02-20    2010-02-22    SleepMode
       3           2010-02-10    2010-02-18    SleepMode
       4           2010-03-10    2010-03-15    Active"
      
       data <-  read.table(textConnection(data), header=TRUE)
       setDT(data)
       dcast(data[, .N, by=.(MachineID, Status)], MachineID ~ Status, fill=0, value.var="N")
      

      【讨论】:

      • 答案反映了提供的解决方案。在代码中,SwitchedOnDate 列没有起任何作用。请澄清,是否还需要考虑 SwitchedOnDate 列。
      • 您不需要.N,因为dcast 有一个fun.aggregate 参数,默认为length(有关说明,请参阅here)。
      • 你好。是的,我们的想法是找出“对于每台机器,它处于睡眠模式的不同天数以及处于活动模式的不同天数”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多