首页 > 解决方案 > 将行转置为相应的列

问题描述

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

  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)

标签: rdplyrtranspose

解决方案


您需要创建一列来区分最终输出中的每一行。如果您的数据遵循与示例相同的模式,您可以为每两行或每个值创建一个新行 where 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 

推荐阅读