【问题标题】:cut extracting the minimum and maximum of cut levels as columns in data.frame将切割级别的最小值和最大值提取为 data.frame 中的列
【发布时间】:2016-09-08 09:48:59
【问题描述】:

我有一个数字向量,我想将其转换为五个数字级别。 我可以使用 cut 获得五个级别

dx <- data.frame(x=1:100)
dx$cut <- cut(dx$x,5)

但是我现在在提取关卡的上下边界时遇到问题。 所以例如 (0.901,20.8] 在dx$min 中为0.901,在dx$max 中为20.8。

我试过了:

dx$min <- pmin(dx$cut)
dx$max <- pmax(dx$cut)
dx

但这不起作用。

【问题讨论】:

  • dx$cut 是一个因子变量。您需要从中拆分/提取数字以获取数值

标签: r cut


【解决方案1】:

您可以尝试根据逗号拆分标签(预先转换为character并修改以抑制标点符号,除了,.),然后创建2列:

min_max <- unlist(strsplit(gsub("(?![,.])[[:punct:]]", "", as.character(dx$cut), perl=TRUE), ",")) # here, the regex ask to replace every punctuation mark except a . or a , by an empty string

dx$min <- min_max[seq(1, length(min_max), by=2)]
dx$max <- min_max[seq(2, length(min_max), by=2)]

head(dx)
#  x          cut   min  max
#1 1 (0.901,20.8] 0.901 20.8
#2 2 (0.901,20.8] 0.901 20.8
#3 3 (0.901,20.8] 0.901 20.8
#4 4 (0.901,20.8] 0.901 20.8
#5 5 (0.901,20.8] 0.901 20.8
#6 6 (0.901,20.8] 0.901 20.8

【讨论】:

  • 我发现没有一种默认的方法来做到这一点令人惊讶,这是我经常做的事情,我总是需要像这里给出的那样使用一些技巧,也许我'我没有在寻找正确的关键字...
  • @SimonC。我想您可能会使用数据的seqrange 从数据中获取中断,将length.out 定义为cut 调用中的1+ 个因子。 (我通常使用带有预定义中断的cut,所以我不会遇到这个问题)
  • 对于任何可能对如何实现@Cath 的答案感兴趣的人,您可以这样做:breaks=seq(from=range(my.x)[1]-1, to=range(my.x)[2], length.out=1+my.n.factors)。我在from 处减去一个,因为cut 的默认值不是从最小值开始的。它也不是从min-1 开始的,但对我来说这是最简单的方法。
【解决方案2】:

以下是 tidyverse 风格的解决方案。

library(tidyverse)

tibble(x = seq(-1000, 1000, length.out = 10),
       x_cut = cut(x, 5)) %>% 
  mutate(x_tmp = str_sub(x_cut, 2, -2)) %>% 
  separate(x_tmp, c("min", "max"), sep = ",") %>% 
  mutate_at(c("min", "max"), as.double)
#> # A tibble: 10 x 4
#>         x x_cut           min   max
#>     <dbl> <fct>         <dbl> <dbl>
#>  1 -1000  (-1e+03,-600] -1000  -600
#>  2  -778. (-1e+03,-600] -1000  -600
#>  3  -556. (-600,-200]    -600  -200
#>  4  -333. (-600,-200]    -600  -200
#>  5  -111. (-200,200]     -200   200
#>  6   111. (-200,200]     -200   200
#>  7   333. (200,600]       200   600
#>  8   556. (200,600]       200   600
#>  9   778. (600,1e+03]     600  1000
#> 10  1000  (600,1e+03]     600  1000

reprex package (v0.2.1) 于 2019 年 1 月 10 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多