R通过创建新列和联合值来组合DataFrame的多行

数据挖掘 r 数据清理 数据争吵
2022-02-15 22:44:13

我在 R 中有一个看起来像这样的数据框

 ID    APPROVAL_STEP   APPROVAL_STATUS   APPROVAL_DATE     APPROVER
1234      STEP_A          APPROVED        23-Jan-2019     John Smith
1234      STEP_B          APPROVED        21-Jan-2019      Jane Doe

我需要它看起来像这样

 ID    STEP_A_STATUS  STEP_A_APPROVAL_DATE  STEP_A_APPROVER  STEP_B_STATUS  STEP_B_APPROVAL_DATE  STEP_B_APPROVER
1234     APPROVED         23-Jan-2019         John Smith       APPROVED        21-Jan-2019            Jane Doe

当然,对于原始数据帧,APPROVAL_STATUS、APPROVAL_DATE 或 APPROVER 中的任何一个都可以是 NA。

最优雅的方法是什么?我知道如何通过循环遍历唯一 ID、抓取每一行、创建新列等来做到这一点;但是有什么方法可以更优雅地做到这一点(例如,使用 tidyverse)?

1个回答

您要问的是如何将数据从“长”形式转换为“宽”形式。

您可以只使用包reshape()中的功能stats

#' I constructed your data frame here
x<-data.frame(ID=c(1234,1234),
          APPROVAL_STEP=c("STEP_A","STEP_B"),
          APPROVAL_STATUS=c("APPROVED","APPROVED"),
          APPROVAL_DATE=c("23-Jan-2019","21-Jan-2019"),
          APPROVER=c("John Smith","Jane Doe"))




#' Now to reshape the data

library(stats)
reshape(x, 
    timevar="APPROVAL_STEP",
    idvar="ID",
    sep="_", direction = "wide")

你的输出应该是这样的。

  ID APPROVAL_STATUS_STEP_A APPROVAL_DATE_STEP_A APPROVER_STEP_A APPROVAL_STATUS_STEP_B APPROVAL_DATE_STEP_B
1 1234               APPROVED          23-Jan-2019      John Smith               APPROVED          21-Jan-2019
  APPROVER_STEP_B
1        Jane Doe

列名是一个表面问题,但这就是它的要点。

希望这有帮助!