2016-11-14 98 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

嗨嗨。是的,想法是要找出「對於每臺機器,在睡眠模式下有多少天不同,以及它在主動模式下有多少天不同」 –