假设我有一个带有“a”列的数据框,我想添加一个包含指定Interval的组从属关系的列“b”。
我可以使用cut
和classIntervals
来解决这个问题,创建一个这样的函数:
library(classInt)
df<-data.frame(a=c(1:120))
function.group.data<-
function(my.data,my.method,my.number){
cut(my.data,
breaks=data.frame(classIntervals(my.data,
method=my.method,
n=my.number)[2])[,1]
,include.lowest=T)
}
df$b<-function.group.data(df$a,"quantiles",10)
但这有一些局限性。例如,在b列中,组名称有点像这样[1,12.9]
写下来。出于绘图的目的,我宁愿让他们01-12.9
这样的东西。
此外,我相信R中有一些内置函数,我不需要发明新东西。有人有想法吗?
答案 0 :(得分:2)
我认为您不能格式化cut
功能的标签。使用“(a,b)”区间符号构造标签。但是使用gsub
和一些正则表达式可以格式化剪切输出。例如:
library(classInt)
x <- 1:120
b <- gsub('\\((.*)[,](.*)\\]','0\\1-\\2',
cut(x,classIntervals(x,10,'quantile',dataPrecision=2)$brks))
b <- as.factor(b) ## because gsub returns a character
droplevels(head(b)) ## to remove extra levels(just for display here)
[1] <NA> 01-12.9 01-12.9 01-12.9 01-12.9 01-12.9
Levels: 01-12.9
答案 1 :(得分:1)
试试这个:
levels(df$b) <- gsub('([^0-9]*)((?<=\\[|\\()[0-9\\.]*),([0-9\\.]*).*','\\2-\\3',levels(df$b),perl=T)
levels(df$b) <- gsub('.(.*),(.*).','\\1-\\2',levels(df$b),perl=T)