1

假设我有一个包含“a”列的数据框,并且我想添加一个“b”列,其中包含指定间隔的组从属关系。我可以使用cutclassIntervals解决这个创建这样的函数:

    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 中有一些内置函数,我不必发明新的东西。有人有想法吗?

4

2 回答 2

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
于 2013-02-21T15:31:39.330 回答
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)

于 2013-02-21T15:37:55.147 回答