【问题标题】:Using Mutate to rank specific columns使用 Mutate 对特定列进行排名
【发布时间】:2018-05-03 15:09:28
【问题描述】:

我是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))

【问题讨论】:

  • 你尝试过什么?另外,提供一个可重现的例子。
  • “排名”是指排序吗?
  • 我可以使用以下代码,但它会创建额外的列,而不是在给定行的每个类别中进行排名。
  • 请提供您的预期输出
  • 预期输出将为每个商店名称创建一个额外的行,源列显示“排名”。每个变量都有上面列出的等级代码的结果。如果无法通过这种方式实现,是否有一种更简单的方法来使用 mutate_all 来为排名创建额外的列,其中每列基于列名命名,后面带有“_rank”,所有列都按降序排列客户体验除外?

标签: r dplyr


【解决方案1】:

一般来说,如果您必须在数据框中重复执行某些操作(例如计算排名),您可能希望重塑为长数据。另请注意,您从cbind 得到的是一个矩阵,而不是数据框——可能不是您想要的,因为这意味着数字变量实际上是作为字符出现的。代替cbind,使用data.framedata_frame(用于小标题)。

我在这里所做的是收集到一个长数据框架中,按度量(收入、数量或满意度)分组,然后根据值给出排名,记住你想要不同的满意度顺序和其他度量.

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 年 5 月 4 日创建。

【讨论】:

  • 谢谢!有没有可能按照我想要的方式做?我能想到的唯一解决方案是使用mutate,只选择rank列结果,并将结果绑定到原始数​​据框。
  • 除了长而不是宽之外,我不完全理解这与您想要的有何不同
  • 如何通过以下注意事项使其变宽:所有列都以列名 _rank 命名,排名根据我的升序和降序偏好?
  • 我会修改我的答案
  • 感谢 Camile,这非常有效。如果除了满意度之外还有第二个变量(可能称为清洁度,我想按升序排列),我将如何修改 ifelse 语句?
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2019-11-27
  • 2016-04-08
  • 2022-09-29
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多