首页 > 解决方案 > 使用 dplyr/tidyr 在 R 中格式化/生成新表

问题描述

我有一个使用 df 计算的表格,如下所示。

 Month_considered   pct `ATC Count`
   <fct>            <dbl> <fct>      
 1 Apr-17            54.9 198,337    
 2 May-17            56.4 227,681    
 3 Jun-17            58.0 251,664    
 4 Jul-17            57.7 251,934    
 5 Aug-17            55.5 259,617    
 6 Sep-17            55.7 245,588    
 7 Oct-17            56.6 247,051    
 8 Nov-17            57.6 256,375    
 9 Dec-17            56.9 277,784    
10 Jan-18            56.7 272,818  

现在我想找到两个月之间的 pct 差异。所以所需的输出就像

 Month_considered          pct 
   <fct>                   <dbl>    
 1 Apr-17-May-17            1.5    
 2 May-17-Jun-17            1.6   
 3 Jun-17-Jul-17           - 0.3  

如何像上面那样连接第一列。我确实尝试使用uniteintidyr但它不是我想要生成的输出。谢谢。

标签: rdplyrtidyr

解决方案


我们需要取当前值和下一个值之间的差值

library(dplyr)
library(zoo)
df1 %>%
    arrange(as.yearmon(Month_considered, format = "%b-%y")) %>% # to order
    mutate_at(vars(Month_considered, pct),
              funs(new = lead(., default = last(.)))) %>% 
    unite(Month_considered, Month_considered, Month_considered_new, sep="-") %>% 
    transmute(Month_considered, pct = pct_new - pct)
#   Month_considered  pct
#1     Apr-17-May-17  1.5
#2     May-17-Jun-17  1.6
#3     Jun-17-Jul-17 -0.3
#4     Jul-17-Aug-17 -2.2
#5     Aug-17-Sep-17  0.2
#6     Sep-17-Oct-17  0.9
#7     Oct-17-Nov-17  1.0
#8     Nov-17-Dec-17 -0.7
#9     Dec-17-Jan-18 -0.2
#10    Jan-18-Jan-18  0.0

或使用base R

pct <- df1$pct[-1] - df1$pct[-nrow(df1)]
Month_considered <- paste(df1$Month_considered[-1], 
             df1$Month_considered[-nrow(df1)], sep="-")

data.frame(Month_considered, pct)

推荐阅读