从R中的'cut()'输出一个数值

时间:2015-09-02 14:36:24

标签: r cut

我在这里读到了这个问题: Group numeric values by the intervals

但是,我想输出一个数字(而不是一个因子),特别是下限和/或上限的数值(在单独的列中)

本质上,这是正确的,除了'df $ start'和'df $ end'作为因素给出:

df$start <- cut(df$x, 
                breaks = c(0,25,75,125,175,225,299),
                labels = c(0,25,75,125,175,225),
                right = TRUE)

df$end <- cut(df$x, 
              breaks = c(0,25,75,125,175,225,299),
              labels = c(25,75,125,175,225,299),
              right = TRUE)

使用'as.numeric()'会返回因子的级别(即值1-6)而不是原始数字。

谢谢!

4 个答案:

答案 0 :(得分:6)

cut的大多数行为都与创建您不感兴趣的标签有关。您可能最好使用findInterval.bincode

您将从数据开始

set.seed(17)
df <- data.frame(x=300 * runif(100))

然后设置休息并找到间隔:

breaks <- c(0,25,75,125,175,225,299)
df$interval <- findInterval(df$x, breaks)
df$start <- breaks[df$interval]
df$end <- breaks[df$interval + 1]

答案 1 :(得分:5)

我猜你想要什么,因为如果你想要&#34;原始数字&#34;,你可以使用df$x。我认为你是在用一些数字来反映这个群体?在那个猜测中,以下是什么。

## Generate some example data
x = runif(5, 0, 300)
## Specify the labels
labels = c(0,25,75,125,175,225)
## Use cut as before
y = cut(x, 
    breaks = c(0,25,75,125,175,225,300),
    labels = labels,
    right = TRUE)

当我们将y转换为数字时,这会给出标签的索引。因此,

labels[as.numeric(y)]

或更简单

labels[y]

答案 2 :(得分:1)

我会使用正则表达式,因为所有信息都在cut的输出中。

cut_borders <- function(x){
pattern <- "(\\(|\\[)(-*[0-9]+\\.*[0-9]*),(-*[0-9]+\\.*[0-9]*)(\\)|\\])"

start <- as.numeric(gsub(pattern,"\\2", x))
end <- as.numeric(gsub(pattern,"\\3", x))

data.frame(start, end)
}

文字模式:

  • 第1组:([,所以我们使用(\\(|\\[)

  • 第2组:数字可能为负数,因此我们(-*)正在寻找至少一个可以带小数位的数字([0-9]+),即点({ {1}}和点(\\.*之后的小数。

  • 下一个逗号([0-9]*

  • 第3组:与第2组相同。

  • 第4组:类似于第1组,我们期望使用,)

这是一些带有分位数的随机变量切割。函数]返回我们正在寻找的内容:

cut_borders

答案 3 :(得分:0)

我们可以利用tidyr::extract

library(tidyverse)
set.seed(17)
df <- data.frame(x = cut(300 * runif(100), c(0,25,75,125,175,225,299)))

df %>%
  extract(x, c("start", "end"), "(-?\\d+),(-?\\d+)")
#>     start end
#> 1      25  75
#> 2     225 299
#> 3     125 175
#> 4     225 299
#> 5      75 125
#> 6     125 175
#> ...

reprex package (v2.0.0) 于 2021 年 5 月 11 日创建

附言感谢 user 295691 for the datauser machine 提供正则表达式的初稿,此处已修改。都+1 :)