2016-12-02 54 views
-3

我有以下列格式中的R的數據幀:傳播行索引爲列中的R

> old.dat 
     id type minDate maxDat eventNum 
1 001 A  may june  1 
2 002 B  apr oct  1 
3 002 C  may nov  2 
4 002 B july dec  3 

我想打開行轉換成列,基於eventNum。最大eventNum是3,所以如果某些ID只有1 eventNum,我希望它們填充NA

目標:

 id type1 minDate1 maxDat1 eventNum1 type2 minDate2 maxDat2 eventNum2 type3 minDate3 maxDat3 eventNum3 
1 001  A  may june   1 <NA>  <NA> <NA>  NA <NA>  <NA> <NA>  NA 
2 002  B  apr  oct   1  C  may  nov   2  B  july  dec   3 

下面是一個代碼塊的起點帶來。

old.dat <- data.frame(id = c("001","002","002","002"), 
         type = c("A","B","C","B"), 
         minDate = c("may","apr","may","july"), 
         maxDat = c("june", "oct", "nov", "dec"), 
         eventNum = c(1,1,2,3)) 

我寫了一個for循環,但其相當慢,其花費很長的時間,通過我的數據集的流失,所以任何速度的建議將是巨大的。謝謝!

+6

你的目標是相當多的我能想象最糟糕的格式...無論如何,data.table和reshape2/tidyr都提供了重塑的功能。試試看。 – Roland

回答

2

爲什麼?我不知道是否可以想象這種格式會有用,但這是一種使用tidyr的方法。

首先,我保存新的列名的列表,以使事情更容易拉起來:

newCols <- c("type", "minDate", "MaxDat") 

(我會加入下面的數字)。

然後,我unite荷蘭國際集團需要的值對每個事件,spread荷蘭國際集團,結果得到一個新列每個eventNum,然後separate荷蘭國際集團將結果返回到單獨的列(並附加了事件的數量,它)

old.dat %>% 
    unite(toSpread, type, minDate, maxDat, sep = "::") %>% 
    spread(eventNum, toSpread) %>% 
    separate(`1`, paste0(newCols, "_1"), sep = "::") %>% 
    separate(`2`, paste0(newCols, "_2"), sep = "::") %>% 
    separate(`3`, paste0(newCols, "_3"), sep = "::") 

返回:

id type_1 minDate_1 MaxDat_1 type_2 minDate_2 MaxDat_2 type_3 minDate_3 MaxDat_3 
1 001  A  may  june <NA>  <NA>  <NA> <NA>  <NA>  <NA> 
2 002  B  apr  oct  C  may  nov  B  july  dec 

下面是一個可供選擇的方法,首先(與gather將數據轉換爲一個長形),然後生成新列名並進行傳播。對於新列,複雜的mutate行分配因子級別僅需要對列進行排序,並使用中的parse_number來提取事件編號。如果您確定輸出列按字母順序排序,則可以跳過該步驟。這種方法對於附加事件編號是強大的,因爲它會自動爲eventNum中的每個唯一值添加事件。

old.dat %>% 
    gather(Metric, Value, type, minDate, maxDat) %>% 
    unite(newColHead, Metric, eventNum) %>% 
    mutate(newColHead = factor(newColHead 
          , levels = 
           unique(newColHead) %>% 
           {.[order(parse_number(.))]} 
           )) %>% 
    spread(newColHead, Value) 

對於此用例,輸出與上述內容相同。

(而且,如果你想爲什麼這可能是更好的證據;注意我的編輯 - 我本來貼錯標籤的事件數的2/3。)

+0

謝謝你的幫助!我意識到格式遠未達到最佳狀態,但這是我無法控制的情況所必需的。 – TBSRounder