r - 将行转置为相应的列
问题描述
我有一个示例数据集,其中包含相应的事件,如 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)
解决方案
您需要创建一列来区分最终输出中的每一行。如果您的数据遵循与示例相同的模式,您可以为每两行或每个值创建一个新行 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
推荐阅读
- c# - 如何评估 IEnumerable
同时在 C# 中对其第一个和/或最后一个元素进行特殊处理? - python - Python:如何在包含 if/else 函数的 def 中返回字符串
- c++ - SDL2程序只写字符串的一部分
- python - 如何从文件中导入函数而不执行导入文件中的其余代码?
- java - 如何在其他设备中模拟相同的 Google reCaptcha?
- kotlin - 在 Kotlin Anko 中使用 ConstraintLayout
- java - Spring @Transactional 方法错误处理
- comparison - 判断两个数列是否等价的逻辑
- python - Python for 循环输出到列表中
- java - 事件发生后更新 javafx 中文本字段的值