2017-03-07 139 views
0

我有一個像下面總結忽略某些列

> head(df) 
    OrderId   Timestamp ErrorCode 
1 3000000 1455594300434609920  NA 
2 3000001 1455594300434614272  NA 
3 3000000 1455594300440175104   0 
4 3000001 1455594300440179712   0 
5 3000002 1455594303468741120  NA 
6 3000002 1455594303469326848   0 

我需要一種方式來崩潰行中的DF輸出存在類似下面

> head(df) 
    OrderId   Timestamp1 Timestamp2  ErrorCode Diff 
3000000 1455594300434609920 1455594300440175104  0 
3000001 1455594300434614272 1455594300440179712  0 
3000002 1455594303468741120 1455594303469326848  0 

我用df2=aggregate(Timestamp~.,df,FUN=toString) 但輸出

OrderId ErrorCode   Timestamp 
10 3000001   0 1455594300440179712 
11 3000002   0 1455594303469326848 
12 3000003   0 1455594303713897984 

當我放棄了錯誤代碼列,並使用相同的命令,我得到一個前pected output

> head(kf) 
    OrderId   Timestamp 
1 3000000 1455594300434609920 
2 3000001 1455594300434614272 
3 3000000 1455594300440175104 
4 3000001 1455594300440179712 
5 3000002 1455594303468741120 
6 3000002 1455594303469326848 
> kf2=aggregate(Timestamp~.,kf,FUN=toString) 
head(kf2) 
    OrderId        Timestamp 
10 3000001 1455594300434614272, 1455594300440179712 
11 3000002 1455594303468741120, 1455594303469326848 
12 3000003 1455594303711330816, 1455594303713897984 

如何在不刪除ErrorCode列的情況下以上述方式對其進行聚合。必須有一些我錯過的小東西。

+0

你申請的'ErrorCode'什麼功能? – Sotos

+0

合併到自己然後過濾? 'res < - merge(df1,df1,by =「OrderId」); RES < - 資源[!RES $ Timestamp.x = $資源Timestamp.y,]' – zx8754

+0

Errocode只需要根據的OrderId,NA和0合併爲0 – pythonRcpp

回答

0

我想你實際上是在尋找只是爲了您的數據重塑與單獨的列寬格式時間戳1和2的一種方法是先添加一個新的列來定義測量的時間點,然後融化並使用reshape2來投射數據。

# Add an index to the data.frame 
for (i in unique(df$OrderId)) { 
    ii <- df$OrderId == i 
    df$time_ind[ii] <- seq_along(ii[ii]) 
} 

library(reshape2) 

df_long <- melt(df, id.vars = c("OrderId", "time_ind"), 
       measure.vars = c("Timestamp", "ErrorCode")) 

dcast(df_long, OrderId ~ variable + time_ind) 

,這將給你

OrderId   Timestamp_1   Timestamp_2 ErrorCode_1 ErrorCode_2 
1 3000000 1455594300434609920 1455594300440175104  <NA>   0 
2 3000001 1455594300434614272 1455594300440179712  <NA>   0 
3 3000002 1455594303468741120 1455594303469326848  <NA>   0 
+0

是的,您在理解我所需要的內容時是正確的。你能否詳細說明'df $ time_ind [ii] < - seq_along(ii [ii])'是如何創建df_long的。爲什麼聚合無法執行此操作。由於 – pythonRcpp

+0

原樣,你data.frame沒有變量來確定哪個時間戳是哪個但'dcast'需要,要拆散列。該代碼只是連續索引每個「OrderId」值的連續外觀以提供此操作。我相信'聚合'不知道如何處理好幾個價值欄,並且不是直接面向重塑。 –