gpt4 book ai didi

r - 如何根据R中的值将表划分为不同级别?

转载 作者:行者123 更新时间:2023-12-04 18:00:34 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Using CUT and Quartile to generate breaks in R function

(7 个回答)


5年前关闭。




假设我有以下数据

ID  Category    Price   Month
1 X 2 1
1 X 2 2
1 X 2 3
1 X 2 4
2 X 3 1
2 X 3 2
2 X 3 3
2 X 3 4
3 X 1 1
3 X 1 2
3 X 1 3
3 X 1 4
4 X 10 1
4 X 10 2
4 X 10 3
4 X 10 4
5 Y 5 1
5 Y 5 2
5 Y 5 3
5 Y 5 4
6 Y 2 1
6 Y 2 2
6 Y 2 3
6 Y 2 4
7 Y 1 1
7 Y 1 2
7 Y 1 3
7 Y 1 4
8 Y 10 1
8 Y 10 2
8 Y 10 3
8 Y 10 4

特定类别的产品有不同的价格,有些是低价的,有些是高价的。我想有一个新变量“ Price Level”来显示产品是低价产品、中价产品还是高价产品。

级别定义如下。
它将特定类别中所有产品的价格分为 4 个百分位数。
  • 第一个百分位数 = 低
  • 第二个和第三个百分位数 = 中
  • 第 4 个百分位数 = 高

  • 所以表格看起来像这样
    ID  Category    Price   Month   Price Level
    1 X 4 1 Medium
    1 X 4 2 Medium
    1 X 4 3 Medium
    1 X 4 4 Medium
    2 X 3 1 Medium
    2 X 3 2 Medium
    2 X 3 3 Medium
    2 X 3 4 Medium
    3 X 1 1 Low
    3 X 1 2 Low
    3 X 1 3 Low
    3 X 1 4 Low
    4 X 10 1 High
    4 X 10 2 High
    4 X 10 3 High
    4 X 10 4 High
    5 Y 5 1 Medium
    5 Y 5 2 Medium
    5 Y 5 3 Medium
    5 Y 5 4 Medium
    6 Y 2 1 Low
    6 Y 2 2 Low
    6 Y 2 3 Low
    6 Y 2 4 Low
    7 Y 1 1 Low
    7 Y 1 2 Low
    7 Y 1 3 Low
    7 Y 1 4 Low
    8 Y 10 1 Low
    8 Y 10 2 Low
    8 Y 10 3 Low
    8 Y 10 4 Low

    最佳答案

    您可以 lapply跨越数据框split来自 Category , 并调用 cutquantile在每个组上。 data.framedo.call(rbind,将数据重新组合成单​​个 data.frame:

    do.call(rbind, lapply(split(df, df$Category), function(x){
    data.frame(x, Price_Level = cut(x$Price,
    quantile(x$Price, probs = c(0, .25, .75, 1)),
    labels = c('Low', 'Medium', 'High'),
    include.lowest = TRUE))
    }))

    # ID Category Price Month Price_Level
    # 1 1 X 2 1 Medium
    # 2 1 X 2 2 Medium
    # 3 1 X 2 3 Medium
    # 4 1 X 2 4 Medium
    # 5 2 X 3 1 Medium
    # 6 2 X 3 2 Medium
    # 7 2 X 3 3 Medium
    # 8 2 X 3 4 Medium
    # 9 3 X 1 1 Low
    # 10 3 X 1 2 Low
    # 11 3 X 1 3 Low
    # 12 3 X 1 4 Low
    # 13 4 X 10 1 High
    # 14 4 X 10 2 High
    # 15 4 X 10 3 High
    # 16 4 X 10 4 High
    # 17 5 Y 5 1 Medium
    # 18 5 Y 5 2 Medium
    # 19 5 Y 5 3 Medium
    # 20 5 Y 5 4 Medium
    # 21 6 Y 2 1 Medium
    # 22 6 Y 2 2 Medium
    # 23 6 Y 2 3 Medium
    # 24 6 Y 2 4 Medium
    # 25 7 Y 1 1 Low
    # 26 7 Y 1 2 Low
    # 27 7 Y 1 3 Low
    # 28 7 Y 1 4 Low
    # 29 8 Y 10 1 High
    # 30 8 Y 10 2 High
    # 31 8 Y 10 3 High
    # 32 8 Y 10 4 High

    如果您只想返回单个列,但又不想担心分组弄乱您的订单,则可以使用等效的
    factor(ave(df$Price, df$Category, FUN = function(x){
    cut(x,
    quantile(x, probs = c(0, .25, .75, 1)),
    include.lowest = TRUE)
    }), levels = c(1, 2, 3), labels = c('Low', 'Medium', 'High'))

    一个稍微不那么丑的版本 dplyr :
    library(dplyr)
    df %>% group_by(Category) %>% mutate(Price_Level = cut(Price,
    quantile(Price, c(0, .25, .75, 1)),
    labels = c('Low', 'Medium', 'High'),
    include.lowest = TRUE))

    关于r - 如何根据R中的值将表划分为不同级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36110083/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com