【问题标题】:Creating new column based on repeated consecutive row entries基于重复的连续行条目创建新列
【发布时间】:2020-02-20 14:05:55
【问题描述】:

想象一下以下数据帧的 sn-p:

       ID        ActivityName     Time         Type    Shape 
1       1             Request    0.000       Type_1      767           
2       1             Request  600.000       Type_1      767           
3       1               Start  600.000       Type_1     1376           
4       1               Start  600.000       Type_1     1376  
5       1               Delay 2962.295       Type_1     1022         
6       1 Schedule Activities  600.000       Type_1       15           
7       1 Schedule Activities 2062.295       Type_1       15  

我要做的是根据 ActivityName 中的重复条目创建两个新列。

具体来说,我想将同一活动的两个后续行合并为一行,并带有开始和完成时间戳(从时间开始,以秒为单位)。

鉴于并非 ActivityName 中的所有条目都有匹配的第二个条目(但是,最多两个连续条目相同),我还想删除这样的行,如 Delay 在这种情况下。

它应该看起来像:

       ID        ActivityName  StartTime   EndTime      Type    Shape 
1       1             Request  0.000       600.000      Type_1  767           
2       1               Start  600.000     600.000      Type_1  1375
3       1 Schedule Activities  600.000     2062.295     Type_1  15

ActivityName 中的所有类别在该列中出现多次。我希望不要比较它们的关联时间,而不是跨越整个列,只比较那些连续两次相同出现的。

我们将不胜感激任何有关如何解决此问题的想法。

【问题讨论】:

  • 拥有可重复的数据将帮助您获得答案。您可以使用 dput 函数来提供帮助。
  • @Alex - 我刚刚看到你之前的问题看起来与这个问题相同。它可能有助于用更完整的示例修改您的问题,其中其他解决方案失败,并提供所需的结果。例如,您可以添加单站行的示例吗?以及之前的解决方案对您不起作用的其他情况?

标签: r pivot tidy dtplyr


【解决方案1】:

这样的?

df<-data.frame(activity_name = c("A", "A", "B", "B", "C", "C"),
               time = c(0,2,2,4,4,6))
df
  activity_name time
1             A    0
2             A    2
3             B    2
4             B    4
5             C    4
6             C    6
library(tidyverse)
df %>% 
  group_by(activity_name) %>% 
  summarise(StartTime = first(time),
            EndTime = last(time))
  activity_name StartTime EndTime
  <fct>             <dbl>   <dbl>
1 A                     0       2
2 B                     2       4
3 C                     4       6

【讨论】:

  • 您好,谢谢!差不多了 - 问题是当在activity_name中有更多“A”、“B”、“C”等实例时,这总是检查整个列以获得它们的最小和最大关联时间值。相反,我试图在本地比较它们,即两个连续出现的 A 具有独立于另一对连续 A 的 StartTime 和 EndTime。
【解决方案2】:

在本地比较活动名称组。创建一个新字段作为分组依据,用于标识本地组何时更改。

df<-data.frame(activity_name = c("A", "A", "B", "B", "C", "C", "A"),
               time = c(0,2,2,4,4,6,99))
  activity_name time
1             A    0
2             A    2
3             B    2
4             B    4
5             C    4
6             C    6
7             A   99
library(tidyverse)

df %>% 
  mutate(groupChanged = (activity_name != lag(activity_name, default = activity_name[1])),
         toCutBy = cumsum(groupChanged)) %>% 
  group_by(toCutBy) %>%
  summarise(activity_name = first(activity_name),
            StartTime = first(time),
            EndTime = last(time))
  toCutBy activity_name StartTime EndTime
1       0 A                     0       2
2       1 B                     2       4
3       2 C                     4       6
4       3 A                    99      99

示例:https://stackoverflow.com/a/43127176/10276092

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多