r语言 - 是否有函数可以在字符串中"evaluate"一系列数字?



我有一个"图例",描述了数字可以进入的类别。我想使用某种case_when方法将数字分类到这些类别中。有没有一种方法可以"评估"这些字符串中的数字范围,这样我就可以对数字进行相应的排序?

tribble(~n_treatment_category, ~level,
"< 25", 1,
"26 - 34", 2,
"35 - 47", 3,
"48 - 77", 4,
"> 78 ", 5)

假设treatcat是类别范围字符串的输入向量。注意,该问题中存在错误,因为对于要校正的范围,不等式应该<=和>=。下面我们处理了<并且>就好像它们<=和>=。

现在读取中的数字,并使用指示的cut命令。如果您想要整数类别,请在cut命令中使用labels = FALSE,或者省略标签以获得形式(---,---].

在这里,我们将数字分类为1:100,所以用你想分类的任何数字来代替它。

treatcat <- c("< 25", "26 - 34", "35 - 47", "48 - 77", "> 78 ") # test input
r <- na.omit(read.table(text = gsub("[<>-]", "", treatcat), fill = NA, header = FALSE))
cc <- cut(1:100, c(-Inf, r$V1 - 1, r$V2[nrow(r)], Inf), labels = treatcat)
cc

给予:

[1] < 25    < 25    < 25    < 25    < 25    < 25    < 25    < 25    < 25   
[10] < 25    < 25    < 25    < 25    < 25    < 25    < 25    < 25    < 25   
[19] < 25    < 25    < 25    < 25    < 25    < 25    < 25    26 - 34 26 - 34
[28] 26 - 34 26 - 34 26 - 34 26 - 34 26 - 34 26 - 34 26 - 34 35 - 47 35 - 47
[37] 35 - 47 35 - 47 35 - 47 35 - 47 35 - 47 35 - 47 35 - 47 35 - 47 35 - 47
[46] 35 - 47 35 - 47 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77
[55] 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77
[64] 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77
[73] 48 - 77 48 - 77 48 - 77 48 - 77 48 - 77 > 78    > 78    > 78    > 78   
[82] > 78    > 78    > 78    > 78    > 78    > 78    > 78    > 78    > 78   
[91] > 78    > 78    > 78    > 78    > 78    > 78    > 78    > 78    > 78   
[100] > 78   
Levels: < 25 26 - 34 35 - 47 48 - 77 > 78 

检查答案

我们可以这样验证以上内容是否正确:

split(1:100, cc)

给予:

$`< 25`
[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
$`26 - 34`
[1] 26 27 28 29 30 31 32 33 34
$`35 - 47`
[1] 35 36 37 38 39 40 41 42 43 44 45 46 47
$`48 - 77`
[1] 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[26] 73 74 75 76 77
$`> 78 `
[1]  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
[20]  97  98  99 100

您可以进行一些字符串操作来梳理边界,然后使用findInterval:

range <- gsub("[<> ]", "", dat$n_treatment_category)
range <- gsub("([0-9]+).*$", "\1", range)
range <- sort(as.numeric(range))[-1] # don't need lowest number
set.seed(1)
numbers <- runif(10, 0, 100)
numbers
#> [1] 26.551 37.212 57.285 90.821 20.168 89.839 94.468 66.080 62.911  6.179
findInterval(numbers, c(0, range, Inf), right = FALSE)
#> [1] 2 3 4 5 1 5 5 4 4 1

最新更新