将行转置为相应的列

Transpose Rows into Corresponding Columns

我有一个示例数据集,其中包含相应的事件,例如按 ID 列出的“开始”和“结束”日期。但是,数据不是很干净。用相应的事件在 r 中重塑此 table 的最佳方法是什么?我尝试在 dplyr 和 reshape 中执行此操作,但它没有用,所以我认为采用“下一个”行的值可能会起作用。我不确定这是正确的方法。例如,数据当前的样子如下:

  ID Event      Date
  1 Enter  1/1/2021
  1 Leave  1/5/2021
  2 Enter  5/4/2021
  2 Leave 5/30/2021
  2 Enter  6/2/2021
  2 Leave  6/5/2021

期望的输出:

  ID Enter_Date   Leave_Date
  1 1/1/2021      1/5/2021
  2 5/4/2021      5/30/2021
  2 6/2/2021      6/5/2021

这是一个示例数据集:

ID <- c(1,1,2,2,2,2)
Event <- c("Enter", "Leave", "Enter", "Leave", "Enter", "Leave")
Date <- c("1/1/2021", "1/5/2021", "5/4/2021", "5/30/2021", 
          "6/2/2021", "6/5/2021")
df <- data.frame(ID, Event, Date)

您需要创建一个列来区分最终输出中的每一行。如果您的数据遵循与您的示例相同的模式,您可以为每两行或为 Event == 'Enter'.

的每个值创建一个新行
library(dplyr)
library(tidyr)

df %>%
  mutate(index_row = cumsum(Event == 'Enter')) %>%
  pivot_wider(names_from = Event, values_from = Date) %>%
  select(-index_row)

#     ID Enter    Leave    
#  <dbl> <chr>    <chr>    
#1     1 1/1/2021 1/5/2021 
#2     2 5/4/2021 5/30/2021
#3     2 6/2/2021 6/5/2021