如何根据R中的值将表划分为不同的级别?
假设我有以下数据如何根据R中的值将表划分为不同的级别?,r,R,假设我有以下数据 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
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
特定类别的产品有不同的价格,有些是低价的,有些是高价的。我想有一个新变量“价格水平
”,它显示产品是低价产品、中价产品还是高价产品
级别定义如下。
它将特定类别中所有产品的价格划分为4个百分点
- 第1百分位=低
- 第二和第三百分位=中等
- 第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
您可以通过
Category
对数据帧进行lappy
,并对每组调用cut
和quantile
data.frame
和do.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))
我们可以使用
data.table
library(data.table)
setDT(df)[, Price_Level := cut(Price,
quantile(Price, c(0, .25, .75, 1)),
labels = c('Low', 'Medium', 'High'),
include.lowest = TRUE), by = Category]
我尝试在原始数据上应用代码,因为每个类别和月份的行数不相等,所以我得到了错误“‘中断’不是唯一的”,所以我尝试将分位数放在唯一函数中,然后我得到了错误“中断的长度’和‘标签’不同”。如何修复它?@Jaykhan在示例数据中,它正在工作。我尝试将代码应用于原始数据,因为原始数据在每个类别和月份中的行数不相等,所以我得到了错误“'breaks'不是唯一的”,所以我尝试将分位数放在唯一函数中,然后我得到了错误“breaks'和'label'的长度不同”。如何修复?能否使用导致问题的数据子集进行编辑?