使用Mutate对特定列进行排名

时间:2018-05-03 15:09:29

标签: r dplyr

我是dplyr的相对新手。我有一个data.frame组织了每个商店名称和来源(由2018年的结果组成)构成观察结果。变量是总收入,数量,客户体验得分和其他一些。

我想对data.frame中的每个类别进行排名,并创建新的观察结果。所有变量将按降序排列,但客户体验和一个额外列将按升序排列。我想称这个来源称为“排名”。

store <- c("NYC", "Chicago", "Boston")
source <- c("2018", "2018", "2018")
revenue <- c(10000, 50000, 2000)
quantity <- c(100, 50, 20)
satisfaction <- c(3, 2, 5)
table <- cbind(store, source, revenue, quantity, satisfaction)

我能够使用mutate获得我需要的东西,但我不得不手动命名每个新列。我相信有一种更有效的方法可以将这些值排在那里!

这是我最初做的:

table <- table %>%
mutate(revenue_rank = rank(-revenue), quantity_rank = rank(-quantity), satisfaction_rank = rank(satisfaction))

1 个答案:

答案 0 :(得分:1)

通常,如果您不得不在数据框中重复执行某些操作(例如计算排名),则可能需要重新构建长数据。还要注意,你从cbind获得的是一个矩阵,而不是数据框 - 可能不是你想要的,因为这意味着数字变量实际上是作为字符出现的。而不是cbind,请使用data.framedata_frame(对于tibble)。

我在这里做的是收集到一个长数据框,按照度量(收入,数量或满意度)分组,然后根据价值给出排名,记住你想要不同的订单满足和其他措施

library(tidyverse)

store <- c("NYC", "Chicago", "Boston")
source <- c("2018", "2018", "2018")
revenue <- c(10000, 50000, 2000)
quantity <- c(100, 50, 20)
satisfaction <- c(3, 2, 5)

df <- data_frame(store, source, revenue, quantity, satisfaction)

df %>%
    gather(key = measure, value = value, revenue:satisfaction) %>%
    group_by(measure) %>%
    mutate(rank = ifelse(measure == "satisfaction", rank(value), rank(-value))) %>%
    ungroup() %>%
    select(-value) %>%
    mutate(measure = paste(measure, "rank", sep = "_")) %>%
    spread(key = measure, value = rank)
#> # A tibble: 3 x 5
#>   store   source quantity_rank revenue_rank satisfaction_rank
#>   <chr>   <chr>          <dbl>        <dbl>             <dbl>
#> 1 Boston  2018               3            3                 3
#> 2 Chicago 2018               2            1                 1
#> 3 NYC     2018               1            2                 2

reprex package(v0.2.0)创建于2018-05-04。