使用聚集和传播旋转df之后,我可以根据新的Var变量对行进行排序吗?

时间:2017-02-02 07:35:34

标签: r dplyr

示例数据:

sample_data <- data.frame(
  Device = c("Desktop", "Desktop", "Desktop", "Tablet", "Tablet", "Tablet", "Mobile", "Mobile", "Mobile"),
  Date_Range = seq(as.Date("2017-01-01"), as.Date("2017-01-30"), by = 1),
  Sessions = ceiling(rnorm(90, mean = 3000, sd = 300)),
  Conversion1 = ceiling(rnorm(90, mean = 800, sd = 100)),
  Conversion2 = ceiling(rnorm(90, mean = 400, sd = 50))
)

与dplyr进行一些争论

library(dplyr)
example <- tbl_df(sample_data) %>%
  group_by(Date_Range) %>%
  summarize(Sessions = sum(Sessions),
            Con1 = sum(Conversion1),
            Con2 = sum(Conversion2)) %>%
  mutate(Registration_Rate = round(Con1/Sessions,2),
         Conversion_Rate = round(Con2/Sessions,2)) %>%
  gather(Var, Val, - Date_Range) %>%
  group_by(Date_Range) %>%
  spread(Date_Range, Val)

这导致按日期从左到右读取KPI,包括会话,转化次数和产生的转化率。

屏幕: enter image description here

我想订购这些行。目前行的顺序为:

Con1,Con2,Conversion_Rate,Registration_Rate,Sessions(看起来像是按字母顺序排列)。

具体来说,我希望按以下顺序排列表格: 会话,Con1,Con2,Registration_Rate,Conversion_Rate。

我查看了row.names(示例),但返回的字符向量为1:5(是的字符)。

理想情况下,我可以通过在gather()操作期间创建的Var变量对行进行排序。所以按名称而不是索引对它们进行排序。但不是为了简单的牺牲。

有没有直接的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

一种方法可能是:

example <- tbl_df(sample_data) %>%
  group_by(Date_Range) %>%
  summarize(Sessions = sum(Sessions),
            Con1 = sum(Conversion1),
            Con2 = sum(Conversion2)) %>%
  mutate(Registration_Rate = round(Con1/Sessions,2),
         Conversion_Rate = round(Con2/Sessions,2)) %>%
  gather(Var, Val, - Date_Range) %>%
  group_by(Date_Range) %>%
  spread(Date_Range, Val)%>%
  mutate(Var =  factor(Var, levels = c("Sessions", "Con1", "Con2", "Registration_Rate", "Conversion_Rate"))) %>%
  arrange(Var)

Var是一个字符向量,因此将其转换为一个因子并将levels设置为所需的顺序意味着arrange()将根据这些级别进行排序。