将连续数字转换为R中的固定间隔

时间:2020-07-01 14:28:47

标签: r

我有一个从0到20的数字序列,想要将它们转换成固定的间隔。我现在在R中有以下代码:

set.seed(21)
x<-sample(0:20, 100, replace=TRUE)
c1<-cut(x,seq(0, 20, by = 5))
table(c1)

这给了我

c1  
 (0,5]  (5,10] (10,15] (15,20] 
    24      12      29      32 

我不需要频率。 x的限制和应转换为的相应间隔如下:

  • 17.5-02.5 => 0
  • 02.5-07.5 => 5
  • 07.5-12.5 => 10
  • 12.5-17.5 => 15

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以遍历每个值,并检查与任何间隔值c(0, 5, 10, 15)的绝对差是否小于2.5:

ivl <- c(0, 5, 10, 15)
sapply(x, function(y) ifelse(y > 17.5, 0, ivl[abs(y - ivl) < 2.5]))

另一个选择是使用比较器。您可以为此使用基数R的ifelse,但是dplyr::case_when会更简洁一些:

dplyr::case_when(x < 2.5  | x > 17.5 ~ 0,
                 x > 2.5  & x < 7.5  ~ 5,
                 x > 7.5  & x < 12.5 ~ 10,
                 x > 12.5 & x < 17.5 ~ 15)

在两种情况下,您最终都具有以下向量:

  [1]  0  0 10 15 15  0 10  0  5 10  5  5  5  0  0 10 15 10 15  0 10  5  5 10  5 15  0  0 15  0
 [31] 15  0 10 10  0 15  5  5  5 10 10  0  0 15  5  5  5  5 10 10 15 10 10 15  5  0 10  0  5  0
 [61]  0 10 10  0 10  0  5  0 15  5 15 15 10  5 15  0  5  5  0  5  5  0 15  5  5 10  5 15  0 10
 [91] 10  0 15 15  0 15  0 10  5  5

答案 1 :(得分:0)

以防万一,您正在寻找此间隔

[0,2.5]   (2.5,7.5]  (7.5,12.5] (12.5,17.5]   (17.5,20] 

这尚不清楚,因为您需要17.5-2.5之间的一个间隔, 这是cut和相应的频率表的结果。

set.seed(21)
x<-sample(0:20, 100, replace=TRUE)
# c1<-cut(x, seq(0, 20, by = 5))

cut(x, breaks=c(0, 2.5, 7.5, 12.5, 17.5, 20), include.lowest=TRUE)
#>   [1] [0,2.5]     [0,2.5]     (7.5,12.5]  (12.5,17.5] (12.5,17.5] (17.5,20]  
#>   [7] (7.5,12.5]  (17.5,20]   (2.5,7.5]   (7.5,12.5]  (2.5,7.5]   (2.5,7.5]  
#>  [13] (2.5,7.5]   [0,2.5]     [0,2.5]     (7.5,12.5]  (12.5,17.5] (7.5,12.5] 
#>  [19] (12.5,17.5] [0,2.5]     (7.5,12.5]  (2.5,7.5]   (2.5,7.5]   (7.5,12.5] 
#>  [25] (2.5,7.5]   (12.5,17.5] [0,2.5]     [0,2.5]     (12.5,17.5] [0,2.5]    
#>  [31] (12.5,17.5] [0,2.5]     (7.5,12.5]  (7.5,12.5]  (17.5,20]   (12.5,17.5]
#>  [37] (2.5,7.5]   (2.5,7.5]   (2.5,7.5]   (7.5,12.5]  (7.5,12.5]  [0,2.5]    
#>  [43] (17.5,20]   (12.5,17.5] (2.5,7.5]   (2.5,7.5]   (2.5,7.5]   (2.5,7.5]  
#>  [49] (7.5,12.5]  (7.5,12.5]  (12.5,17.5] (7.5,12.5]  (7.5,12.5]  (12.5,17.5]
#>  [55] (2.5,7.5]   [0,2.5]     (7.5,12.5]  (17.5,20]   (2.5,7.5]   (17.5,20]  
#>  [61] (17.5,20]   (7.5,12.5]  (7.5,12.5]  (17.5,20]   (7.5,12.5]  [0,2.5]    
#>  [67] (2.5,7.5]   [0,2.5]     (12.5,17.5] (2.5,7.5]   (12.5,17.5] (12.5,17.5]
#>  [73] (7.5,12.5]  (2.5,7.5]   (12.5,17.5] (17.5,20]   (2.5,7.5]   (2.5,7.5]  
#>  [79] (17.5,20]   (2.5,7.5]   (2.5,7.5]   [0,2.5]     (12.5,17.5] (2.5,7.5]  
#>  [85] (2.5,7.5]   (7.5,12.5]  (2.5,7.5]   (12.5,17.5] [0,2.5]     (7.5,12.5] 
#>  [91] (7.5,12.5]  [0,2.5]     (12.5,17.5] (12.5,17.5] [0,2.5]     (12.5,17.5]
#>  [97] [0,2.5]     (7.5,12.5]  (2.5,7.5]   (2.5,7.5]  
#> Levels: [0,2.5] (2.5,7.5] (7.5,12.5] (12.5,17.5] (17.5,20]

table(cut(x, breaks=c(0, 2.5, 7.5, 12.5, 17.5, 20), include.lowest=TRUE))
#> 
#>     [0,2.5]   (2.5,7.5]  (7.5,12.5] (12.5,17.5]   (17.5,20] 
#>          18          28          24          20          10
相关问题