在R中创建具有组附属关系的列

时间:2013-02-21 14:02:27

标签: r grouping

假设我有一个带有“a”列的数据框,我想添加一个包含指定Interval的组从属关系的列“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中有一些内置函数,我不需要发明新东西。有人有想法吗?

2 个答案:

答案 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)