Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中有条件的dcast_R_Reshape2_Dcast - Fatal编程技术网

在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
它:

  • 使用特定条件筛选data.frame
  • 添加列以存储“组”
  • 将值分散到列(相当于dcast)
  • 数据:
    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
    ...