如何在 R 中为虚拟对象创建一个自动范围?
How to create an automated range for dummy in R?
我有 followinf DF,我想创建一个具有自动比例的虚拟模型来明确表示一个城市的公司数量是少、中还是多。
cities
sum of companies
CTY A
199
CITY B
358
CITY C
250
CITY D
1265
CITY E
610
我尝试了以下代码:
#install.packages("scales")
library(scales)
COMP_SCALES<- breaks_extended() #from packages Scales
COMP_A<-COMP_SCALES(df[2], n =4)
COMP_A <- cut(df[2],
breaks=c(-Inf, COMP_A[2],COMP_A[3],COMP_A[4], Inf),
labels=c("LITTLE","MEDIUM","A LOT OF","+ A LOT OF"))
但是自动计算出来的比例不是很合适table,一旦所有的城市都在小范围内。我怎样才能更好地自动化此代码?
最后的 porpuse 是创建一个 table 以更好地可视化结果,如下所示:
COMP_A_CLUSTER <- as.data.frame.matrix(table(COMP_A,kmeans.k$cluster))
预期结果:
A市应该放在“小”。
B市和C市应该放在“中”。
E市应该放在“很多”。
D市应该放在“+很多”。
我有一个包含 10,000 多个城市和 100 多个列的列表来执行类似的过程,这就是为什么我希望自动计算虚拟模型的比例。
您可以使用 quantile
来选择每个样本数量相等的区间。默认情况下,quantile
分为 4 个间隔 (probs = seq(0, 1, 0.25)
),但您可以为 probs
参数指定不同的间隔。
COMP_A <- cut(df[,2],
breaks=quantile(df[,2]),
labels=c("LITTLE","MEDIUM","A LOT OF","+ A LOT OF"))
如果知道每个类别的结束(右)边界是什么,就可以编写自己的函数。下面是一个简单的例子。 DF 有一个新专栏 'CatCities' 并且有您要找的内容。
有以下假设
- sum.of.companies 的最小值大于或等于 0
- sum.of.companies 的最高值为 10000(您可以更改)
函数参数中的 - 'CategoryList' 严格递增(从最低到最高),参数 'EndPoints'
也是如此
- 'CategoryList' 和 'EndPoints' 参数的向量长度在函数调用中相等
DF <- read.csv("./SomeDF.csv")
ClassifyRange <- function(x, CategoryList=c("Little","Medium","a lof of","+a lot of"),EndPoints=c(250,500,1000,10000)){
Index <- which((EndPoints -x) >= 0)
return(CategoryList[Index[1]])
}
DF$CatCities <- lapply(DF$sum.of.companies, FUN=ClassifyRange)
它产生以下输出
我有 followinf DF,我想创建一个具有自动比例的虚拟模型来明确表示一个城市的公司数量是少、中还是多。
cities | sum of companies |
---|---|
CTY A | 199 |
CITY B | 358 |
CITY C | 250 |
CITY D | 1265 |
CITY E | 610 |
我尝试了以下代码:
#install.packages("scales")
library(scales)
COMP_SCALES<- breaks_extended() #from packages Scales
COMP_A<-COMP_SCALES(df[2], n =4)
COMP_A <- cut(df[2],
breaks=c(-Inf, COMP_A[2],COMP_A[3],COMP_A[4], Inf),
labels=c("LITTLE","MEDIUM","A LOT OF","+ A LOT OF"))
但是自动计算出来的比例不是很合适table,一旦所有的城市都在小范围内。我怎样才能更好地自动化此代码?
最后的 porpuse 是创建一个 table 以更好地可视化结果,如下所示:
COMP_A_CLUSTER <- as.data.frame.matrix(table(COMP_A,kmeans.k$cluster))
预期结果: A市应该放在“小”。 B市和C市应该放在“中”。 E市应该放在“很多”。 D市应该放在“+很多”。
我有一个包含 10,000 多个城市和 100 多个列的列表来执行类似的过程,这就是为什么我希望自动计算虚拟模型的比例。
您可以使用 quantile
来选择每个样本数量相等的区间。默认情况下,quantile
分为 4 个间隔 (probs = seq(0, 1, 0.25)
),但您可以为 probs
参数指定不同的间隔。
COMP_A <- cut(df[,2],
breaks=quantile(df[,2]),
labels=c("LITTLE","MEDIUM","A LOT OF","+ A LOT OF"))
如果知道每个类别的结束(右)边界是什么,就可以编写自己的函数。下面是一个简单的例子。 DF 有一个新专栏 'CatCities' 并且有您要找的内容。
有以下假设
- sum.of.companies 的最小值大于或等于 0
- sum.of.companies 的最高值为 10000(您可以更改) 函数参数中的
- 'CategoryList' 严格递增(从最低到最高),参数 'EndPoints' 也是如此
- 'CategoryList' 和 'EndPoints' 参数的向量长度在函数调用中相等
DF <- read.csv("./SomeDF.csv")
ClassifyRange <- function(x, CategoryList=c("Little","Medium","a lof of","+a lot of"),EndPoints=c(250,500,1000,10000)){
Index <- which((EndPoints -x) >= 0)
return(CategoryList[Index[1]])
}
DF$CatCities <- lapply(DF$sum.of.companies, FUN=ClassifyRange)
它产生以下输出