2017-03-07 140 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”值的连续外观以提供此操作。我相信'聚合'不知道如何处理好几个价值栏,并且不是直接面向重塑。 –