【问题标题】:R: Unstack a column with datesR:取消堆叠带有日期的列
【发布时间】:2020-03-30 16:47:41
【问题描述】:

假设我有以下数据框:

df <- data.frame(Order=c("1234567","1234567","1234567","456789","456789"),Stage=c("Pipeline","Proposal","Closed","Pipeline","Lost"),StageChange=c("2008-01-01","2008-01-02","2008-01-03","2008-01-10","2008-01-12"))

导致:

    head(df)
    Order    Stage StageChange
1 1234567 Pipeline  2008-01-01
2 1234567 Proposal  2008-01-02
3 1234567   Closed  2008-01-03
4  456789 Pipeline  2008-01-10
5  456789     Lost  2008-01-12

我需要解开“Stage”列并进入这样的数据框:

    Order   Pipeline   Proposal     Closed       Lost
1 1234567 2008-01-01 2008-01-02 2008-01-03         NA
2  456789 2008-01-10         NA         NA 2008-01-12

我阅读了文档并尝试了使用 dplyr 和 tidyr (like in this thread) 的不同方法,但我的无知正在获胜。

有什么想法可以完成我需要的吗?

明确地说,我的目标是使用这些数据来计算特定订单在特定阶段花费的天数。一些订单丢失,其他订单已关闭(赢),这就是为什么有“NA”值的原因。当订单没有更改到特定阶段时也会发生同样的情况(订单可以从管道转到丢失,中间阶段没有任何更改)。

谢谢!

【问题讨论】:

标签: r tidyr transpose


【解决方案1】:

您可以使用tidyr::pivot_wider。那是新版本的退休功能spread

# install.packages("tidyr")
library(tidyr)

df %>%
  pivot_wider(names_from = Stage, values_from = StageChange)

# # A tibble: 2 x 5
#   Order   Pipeline   Proposal   Closed     Lost      
#   <fct>   <fct>      <fct>      <fct>      <fct>     
# 1 1234567 2008-01-01 2008-01-02 2008-01-03 NA        
# 2 456789  2008-01-10 NA         NA         2008-01-12

【讨论】:

  • 谢谢!不知道这个功能。像魅力一样工作!
【解决方案2】:

日期将是 factor

library(tidyverse)

df_wide <- df %>%
  tidyr::pivot_wider(names_from = Stage, values_from = StageChange)
df_wide

# A tibble: 2 x 5
  Order   Pipeline   Proposal   Closed     Lost      
  <fct>   <fct>      <fct>      <fct>      <fct>     
1 1234567 2008-01-01 2008-01-02 2008-01-03 NA        
2 456789  2008-01-10 NA         NA         2008-01-12

如果您想将日期转换为 Date

df_wide_dates <- df %>%
  tidyr::pivot_wider(names_from = Stage, values_from = StageChange) %>%
  dplyr::mutate_at(., vars(Pipeline, Proposal, Closed, Lost), as.Date)
df_wide_dates

# A tibble: 2 x 5
  Order   Pipeline   Proposal   Closed     Lost      
  <fct>   <date>     <date>     <date>     <date>    
1 1234567 2008-01-01 2008-01-02 2008-01-03 NA        
2 456789  2008-01-10 NA         NA         2008-01-12

【讨论】:

  • 非常感谢!我将“已回答”标志给了@nurandi,因为似乎他对 pivot_wider 的回答排在第一位。
【解决方案3】:

使用dplyr::spread

library(dplyr)

df %>% 
  spread(Stage,StageChange) %>% 
  select(Order,Pipeline,Proposal,Closed,Lost)

【讨论】:

  • 要保持最新状态,请使用pivot_wider() 而不是spread():“spread() 的开发已完成,对于新代码,我们建议切换到更易于使用的 pivot_wider(),功能更丰富,仍在积极开发中。df %>% spread(key, value) 等价于 df %>% pivot_wider(names_from = key, values_from = value)"
猜你喜欢
  • 2017-03-21
  • 2019-08-17
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2016-09-17
  • 2021-08-23
  • 2016-04-28
  • 2021-12-16
相关资源
最近更新 更多