【问题标题】:group_by to select first two rows, then spread()group_by 选择前两行,然后 spread()
【发布时间】:2018-07-24 06:49:50
【问题描述】:

我正在尝试重新格式化它,以便生成On Hold Begins 的所有实例的数据框以及紧随其后的下一个事件。 On Hold Begins 是事件的开始,我想捕获它的 TimestampDeviation 以及 TimestampDeviation 用于紧随其后的下一个事件(即Below Thresold,@987654329 @)。

如果可能,我只想包含将On Hold Begins 作为第一个事件的切片(因此理想的解决方案不包括上面的第 1 行和第 2 行),不想要额外的 X 列,并且希望它被格式化正如我所描述的。 这类似于:How can I spread repeated measures of multiple variables into wide format?,但我在尝试查找字典时遇到了错误。

非常感谢大家的帮助。

【问题讨论】:

  • 必须是 dplyr 解决方案吗?似乎您可以使用普通的 R 索引轻松地做到这一点。
  • 不,但我确实已经建立了一个连锁店。如果有办法愿意让步:)

标签: r dplyr slice tidyr


【解决方案1】:

使用基础 R 的简单解决方案:

first_idx <- which(df$Flag == "On Hold Begins")
second_idx <- first_idx + 1
df_1 <- df[first_idx,]; colnames(df_1) <- paste("Flag 1 ", colnames(df_1))
df_2 <- df[second_idx,]; colnames(df_2) <- paste("Flag 2 ", colnames(df_2))
cbind(df_1, df_2)

   Flag 1  Stage   Flag 1  Flag Flag 1  Timestamp Flag 1  x Flag 1  Deviation Flag 2  Stage    Flag 2  Flag Flag 2  Timestamp Flag 2  x Flag 2  Deviation
3              a On Hold Begins     4/29/17 15:34         1             1.200             a Below Threshold     4/29/17 15:35         1            0.0000
6              a On Hold Begins     4/29/17 21:49         5             1.200             a Below Threshold     4/29/17 21:50         5            0.0000
10             a On Hold Begins     4/29/17 23:29         6             1.200             a Below Threshold     4/29/17 23:30         6            0.0000
12             a On Hold Begins     5/16/17 17:22         8             1.774             a   Stage Enabled     5/16/17 17:39         8            1.8973
15             a On Hold Begins     5/16/17 19:14         9             1.095             a Below Threshold     5/16/17 19:15         9           -0.2252
21             b On Hold Begins     4/28/17 22:05       125             1.200             b    On Hold Ends     4/28/17 22:07       125            1.2000
24             b On Hold Begins     4/28/17 23:29       128             1.200             b Below Threshold     4/28/17 23:30       128            0.0000
26             b On Hold Begins      4/29/17 1:53       133             1.200             b Below Threshold      4/29/17 1:55       133            0.0000
29             b On Hold Begins      4/29/17 2:40       135             1.200          <NA>            <NA>              <NA>        NA                NA

【讨论】:

  • 天哪,这太美了。非常感谢@thc,正是我想要的:)
【解决方案2】:

我的解决方案 1) 将通用序列分配给相关记录; 2) 对集合中的第一个进行分组和切片,并用“标志 1”或“标志 2”标记。

df_tidy <- df %>% 
  slice(-1) %>%             
  mutate(my_serial = case_when(
    str_detect(Flag, "On Hold Begins")~row_number() )) %>% 
    fill(my_serial) %>%     #< Assign serials to related records
  group_by(my_serial) %>% 
  slice(1:2) %>%            #< Take first records in each set
  mutate(flag_number = if_else(
    str_detect(Flag, "On Hold Begins"), "Flag 1", "Flag 2")) #< Tag Records

df_1 <- df_tidy %>% 
  filter(flag_number %in% "Flag 1") %>% 
  select(1:3) %>% 
  setNames(paste0("Flag 1_", names(.)) ) 

df_2 <- df_tidy %>% 
  filter(flag_number %in% "Flag 2") %>% 
  select(1:3) %>% 
  setNames(paste0("Flag 2_", names(.)) ) 

bind_cols(df_1, df_2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多