我正在尝试重新格式化,因此我可以生成On Hold Begins
的所有实例的数据框以及紧随其后的下一个事件。 Timestamp
是一个事件的开始,我想立即捕获其Deviation
和Timestamp
以及Deviation
和Below Thresold
以便立即接收下一个事件之后(即Stage Enabled
,On Hold Begins
)。
如果可能的话,我只想包含bg-dark
作为第一个事件的切片(所以理想的解决方案不包括上面的第1行和第2行),不想要额外的X列,并且想要它按照我的描述进行格式化。
这类似于:How can I spread repeated measures of multiple variables into wide format?,但是当我尝试它时,我遇到了要求字典的错误。
非常感谢你的帮助。
答案 0 :(得分:2)
使用基础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
答案 1 :(得分:0)
我的解决方案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)