首页 文章

依靠符合标准的每个组R [重复]

提问于
浏览
0

这个问题在这里已有答案:

我有以下数据集,我试图找到每台机器处于活动状态并基于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

2 回答

  • 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
    

    注意这些方法做了一些假设,例如,您不能多次出现 MachineIDSwitchedOnDateStatus 的相同组合 . 如果您的数据变得更复杂,请考虑到这一点 .

  • 0

    使用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")
    

相关问题