在r中有条件的dcast
以上是我的数据。 我想制作的是:在r中有条件的dcast,r,reshape2,dcast,R,Reshape2,Dcast,以上是我的数据。 我想制作的是: > log_df[1:10, ] tagid happened status 1 03B2ACE7 2016-06-28 18:07:36 open 2 03B2ACE7 2016-06-28 18:36:15 closed 3 03B2ACE7 2016-06-29 07:29:59 open 4 03B2ACE7 2016-06-29 08:06:23 closed 5 03B2ACE7 2016-0
> log_df[1:10, ]
tagid happened status
1 03B2ACE7 2016-06-28 18:07:36 open
2 03B2ACE7 2016-06-28 18:36:15 closed
3 03B2ACE7 2016-06-29 07:29:59 open
4 03B2ACE7 2016-06-29 08:06:23 closed
5 03B2ACE7 2016-06-30 16:10:48 open
6 03B2ACE7 2016-06-30 17:23:55 open
7 03B2ACE7 2016-07-01 10:12:06 closed
8 03B2ACE7 2016-07-01 13:39:58 closed
9 03B2ACE7 2016-07-02 10:08:40 open
10 03B2ACE7 2016-07-02 13:33:01 closed
...
我试着让它与包中的dcast一起工作。
然而,我必须选择我只接电话的地方
“打开”是第一个,也是唯一在关闭之后出现的,以及在打开之前出现的“关闭”
因此,从log_df中,第6行和第7行将被忽略
我真的被卡住了,不知道该怎么办。。
也许dcast不是最好的方法
请帮忙!非常感谢你 使用
dplyr
和tidyr
(来自tidiverse,重塑的演变):
库(dplyr)
图书馆(tidyr)
df%>%
过滤器((状态=‘打开’&滞后(状态,默认值=)!=‘打开’)|(状态=‘关闭’&潜在客户(状态,默认值=)!=‘关闭”))%>%
变异(r=上限(行号()/2))%>%
传播(状态、发生)
#>tagid r关闭-打开
#>103B2ACE7 1 2016-06-28 18:36:15 2016-06-28 18:07:36
#>203B2ACE7 2 2016-06-29 08:06:23 2016-06-29 07:29:59
#>03B2ACE7 3 2016-07-01 13:39:58 2016-06-30 16:10:48
#>4 03B2ACE7 4 2016-07-02 13:33:01 2016-07-02 10:08:40
它:
df为了保持第一次打开和最后一次关闭,从而从原始df中筛选出第6行和第7行,您可以改为filter((status='open'&lag(status,default=”“)!='open')|(status='closed'&lead(status,default=“)!=“closed”)
。上述解决方案是一个非常好的解决方案。如果一行中有多个打开,则在关闭前保持最后一个打开;如果一行中有多个关闭,则在打开前保持最后一个关闭,然后执行排列。如果,如您的示例(忽略第6行和第7行),您希望保持第一个打开状态和最后一个关闭状态,您可以用另一个过滤器替换上面解决方案中的过滤器。对不起,我明白您的意思,我没有注意过滤了哪个“后续事件”。用@Lamia的过滤器修复代码,这很好。
tagid open closed
1 03B2ACE7 2016-06-28 18:07:36 2016-06-28 18:36:15
2 03B2ACE7 2016-06-29 07:29:59 2016-06-29 08:06:23
3 03B2ACE7 2016-06-30 16:10:48 2016-07-01 10:12:06
...