2016-11-14 68 views
0

我有下面的数据集,我试图找到每台机器处于活动状态的天数以及基于SwitchedOnDate的休眠模式。计算每个组匹配条件R

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 

回答

1

您可以使用count进行分组和计数传递给它的最后一个变量的每一个level的出现,然后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,SwitchedOnDateStatus。如果你的数据变得更加复杂,请考虑。

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") 
+0

答案反映所提供的解决方案。在代码中,SwitchedOnDate列不起任何作用。请澄清,如果SwitchedOnDate列也需要考虑。 –

+1

由于'dcast'有'fun.aggregate'参数,所以''N'不需要'.N',它的默认值是'length'(参见[这里](http://stackoverflow.com/questions/33051386/dcast-restructuring - 从长到宽格式不工作/ 33051521#33051521)的解释)。 – Jaap

+0

嗨嗨。是的,想法是要找出“对于每台机器,在睡眠模式下有多少天不同,以及它在主动模式下有多少天不同” –