R:功能切割

R: function cut

这是我的数据:

>my.cut <- cut(my.variable, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)

>levels(my.cut)
    "[-Inf,-0.5)"  "[-0.5,-0.25)"  "[-0.25,-0.1)"  "[-0.1,0)"  "[0,0.02)"  "[0.02,0.05)"  "[0.05,0.15)"  "[0.15,0.3)"  "[0.3,0.5)"  "[0.5,1)"  "[1, Inf)"

预期结果:

>levels(my.cut)
    "[-Inf,-0.5)"  "[-0.5,-0.25)" "[-0.25,-0.1)" "[-0.1,0)"  "0"  "(0,0.02)" "[0.02,0.05)"  "[0.05,0.15)"  "[0.15,0.3)"  "[0.3,0.5)"   "[0.5,1)"      "[1, Inf)" 

在预期的结果中,有单个数字0,我只想选择my.variable==0,但是用my.cut的公式,没有单个0原因breaks只能用于区间。那我该怎么办?

希望尽快得到您的答复!谢谢!

我认为您对 'cut' 的最好期望是为 0 指定一个非常小的范围,即

cps = c(-Inf, -0.1, 0-.Machine$double.eps, 0+.Machine$double.eps, 0.02, Inf)
bgroup = cut(c(-10, 10, 0,0), breaks = cps)
cat(deparse(levels(bgroup)), "\n") ## use this to edit the levels more easily
levels(bgroup) = c("(-Inf, -0.1]", "(-0.1,0)", "0", "(0,0.02]", "(0.02, Inf]")
table(bgroup) 

显然,显示级别与用于切割数据的级别不同,但如果您同意 window 0 左右,那么解决方案是使用该值形成切割,然后更改标签。

您可以这样做:剪切,在 my.variable == 0 处分配 0,重构。

my.variable <- rnorm(100)
my.variable[sample(1:100,2)] <- 0
my.cut <- cut(my.variable, breaks = c(-Inf, -0.5, -0.25, -0.1, 0, 0.02, 0.05, 0.15, 0.3, 0.5, 1, Inf), right = FALSE)
lvl <- levels(my.cut)
lvlR <- c(lvl[1:4],"0","(0,0.02)",lvl[6:11])
my.cut <- as.character(my.cut)
my.cut[my.variable == 0] <- 0
my.cut <- factor(my.cut,levels=lvlR)
rm(lvl,lvlR)

您可以明确地将每个值放入一个组中。这更灵活,但也更冗长。

实现此目的的一种方法是定义一个定制的剪切函数,然后将其应用于矢量的每个元素。

my.variable <- rnorm(100)

bespoke_cut <- function(value){

  if (value < 0.1) return('[-Inf, 0.1)')

  if (value < 0)   return('[0.1, 0)')

  if (value == 0)  return('0')

  return('(0, Inf]')
}

my.cut <- sapply(my.variable, bespoke_cut)

my.cut <- factor(my.cut)

我只做了几个你想要的分组,但我认为如何添加额外的组应该是显而易见的。