我是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))
答案 0 :(得分:1)
通常,如果您不得不在数据框中重复执行某些操作(例如计算排名),则可能需要重新构建长数据。还要注意,你从cbind
获得的是一个矩阵,而不是数据框 - 可能不是你想要的,因为这意味着数字变量实际上是作为字符出现的。而不是cbind
,请使用data.frame
或data_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。