2

我正在使用cut2库中的 R 函数Hmisc。我给它一个数字向量,然后它变成相同大小的间隔:

library(Hmisc)
vals = c(100, 1000, 2000, 3000, 40000, 50000, 60000)
vals_cut = cut2(vals, g=3)
vals_cut
[1] [  100, 3000) [  100, 3000) [  100, 3000) [ 3000,50000) [ 3000,50000) [50000,60000] [50000,60000]
Levels: [  100, 3000) [ 3000,50000) [50000,60000]

当我尝试vals_cut在与他人共享的图像上使用(例如在统计图形上)时,就会出现问题。人们发现输出难以阅读,因为 a) 数字没有逗号,并且 b) 逗号和第二个数字的开头之间没有空格。

我找不到可以以这种方式修改输出的 cut2 选项。谁能推荐一个简单的方法来做到这一点?谢谢。

4

2 回答 2

3

例子:

library(Hmisc)
vals <-  c(100, 1000, 2000, 3000, 40000, 50000, 60000)
vals_cut = cut2(vals, g=3)
vals_cut

这基本上有效;您可能需要进行外观调整。

library(stringr)
trans_level <- function(x,nsep=" to ") {
    n <- str_extract_all(x,"\\d+")[[1]]  ## extract numbers
    v <- format(as.numeric(n),big.mark=",",trim=TRUE) ## change format
    x <- as.character(x)
    paste0(
        substring(x, 1, 1),
        paste(v,collapse=nsep),
        substring(x, nchar(x), nchar(x)))  ## recombine
}
vals_cut2 <- vals_cut
levels(vals_cut2) <- sapply(levels(vals_cut),trans_level)
vals_cut2
[1] [100 to 3,000)     [100 to 3,000)     [100 to 3,000)     [3,000 to 50,000)  [3,000 to 50,000) [50,000 to 60,000] [50,000 to 60,000]
Levels: [100 to 3,000) [3,000 to 50,000) [50,000 to 60,000]
于 2014-03-14T22:48:35.713 回答
2

这是一个仅用于格式化间隔级别的函数:

formatInterval <- function(x, intsep=", ") {
  if (length(x) > 1) {
    sapply(x, formatInterval, intsep=intsep)
  } else {
    makePretty <- function(z) {
      prettyNum(gsub("[^0-9]", "", z), big.mark=",")
    }
    bracket1 <- substr(x, 1, 1)
    bracket2 <- substr(x, nchar(x), nchar(x))
    x2 <- strsplit(x, ",")
    paste(bracket1,
          makePretty(x2[[1]][1]),
          intsep,
          makePretty(x2[[1]][2]),
          bracket2,
          sep="")    
  }
}

现在

> levels(vals_cut) <- formatInterval(levels(vals_cut))
> vals_cut
[1] [100, 3,000)     [100, 3,000)     [100, 3,000)     [3,000, 50,000)  [3,000, 50,000)  [50,000, 60,000]
[7] [50,000, 60,000]
Levels: [100, 3,000) [3,000, 50,000) [50,000, 60,000]

或者这可能看起来更好

> formatInterval(levels(vals_cut), intsep=" - ")
      [  100, 3000)       [ 3000,50000)       [50000,60000] 
    "[100 - 3,000)"  "[3,000 - 50,000)" "[50,000 - 60,000]" 
于 2014-03-14T23:21:20.557 回答