2012-11-19 21 views
1

我有以下的數據集(請參閱下面的加載數據集)如何用NA代替X來製作交叉表?

 ID  Date qty 
1 ID25 2007-12-01 45 
2 ID25 2008-01-01 26 
3 ID25 2008-02-01 46 
4 ID25 2008-03-01 0 
5 ID25 2008-04-01 78 
6 ID25 2008-05-01 65 
7 ID25 2008-06-01 32 
8 ID99 2008-02-01 99 
9 ID99 2008-03-01 0 
10 ID99 2008-04-01 99 

而且我想創建一個數據透視表。我這樣做,用下面的命令,這似乎是工作的罰款:

pivottable <- xtabs(qty ~ ID + Date, table) 

輸出如下:

ID  2007-12-01 2008-01-01 2008-02-01 2008-03-01 2008-04-01 2008-05-01 2008-06-01 
ID25   45   26   46   0   78   65   32 
ID99   0   0   99   0   99   0   0 

然而,對於ID99只有3段其餘部分標註值爲'0'。我想在第一個表中沒有值的字段中顯示NA。我想獲得一個表,看起來如下:

ID  2007-12-01 2008-01-01 2008-02-01 2008-03-01 2008-04-01 2008-05-01 2008-06-01 
ID25   45   26   46   0   78   65   32 
ID99   NA   NA   99   0   99   NA   NA 

如何做到這一點的任何建議?

加載數據集:

table <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L), .Label = c("ID25", "ID99"), class = "factor"), Date = structure(c(7L, 
1L, 2L, 3L, 4L, 5L, 6L, 2L, 3L, 4L), .Label = c("01/01/2008", 
"01/02/2008", "01/03/2008", "01/04/2008", "01/05/2008", "01/06/2008", 
"01/12/2007"), class = "factor"), qty = c(45L, 26L, 46L, 0L, 
78L, 65L, 32L, 99L, 0L, 99L)), .Names = c("ID", "Date", "qty" 
), class = "data.frame", row.names = c(NA, -10L)) 

table$Date <- as.POSIXct(table$Date, format='%d/%m/%Y') 

回答

3

你可以使用xtabs兩次以獲得您正在尋找的輸出:

  1. 創建該表:

    pivottable <- xtabs(qty ~ ID + Date, table) 
    
  2. 更換所有不存在的公司的零mbinations與NA

    pivottable[!xtabs(~ ID + Date, table)] <- NA 
    

輸出:

 Date 
ID  2007-12-01 2008-01-01 2008-02-01 2008-03-01 2008-04-01 2008-05-01 2008-06-01 
    ID25   45   26   46   0   78   65   32 
    ID99        99   0   99      

注意NA s的不顯示。這是由於該類的print函數。但是您可以使用unclass(pivottable)來實現print的常規行爲。

+0

這工作就像一個魅力!謝謝! – Jochem