【问题标题】:Use regular expressions to detect range of alphanumeric string使用正则表达式检测字母数字字符串的范围
【发布时间】:2018-07-13 15:58:19
【问题描述】:

我需要正则表达式方面的帮助才能执行以下操作。我有一个学习科目列表,名称如下:

subject <- c('x-010', 'x-011', 'x-012', 'x-013', 'x-014', 'x-015', 'x-016', 'x-017', 'x-018', 'x-019', 'x-020', 'x-021', 'x-022', 'x-023', 'x-024', 'x-025', 'x-026', 'x-027', 'x-028', 'x-029', 'x-030')

df <- data.frame(subject) 

我想添加一列,根据主题的数量按组对主题进行分类,例如 1 - 10 属于 A 组,11 - 20 属于 B 组,21 - 30 属于 C 组,依此类推。我不知道如何使用正则表达式来做到这一点,只是开始:

df <- data.frame(subject) %>% 
mutate(case_when(group = str_detect(subject,

但需要了解如何描述这种模式。

【问题讨论】:

  • 这听起来像是替换函数中的一项工作,它使用获取整数的公式来识别数字。

标签: r regex dataframe


【解决方案1】:

我们可以提取数字部分并使用%/%创建组

library(tidyverse)
df %>% 
  group_by(grp = paste0("Group ", LETTERS[(as.numeric(str_extract(subject, 
                        "[0-9]+"))-1) %/% 10 + 1]))
# A tibble: 21 x 2
# Groups:   grp [3]
#   subject grp    
#   <fct>   <chr>  
# 1 x-010   Group A
# 2 x-011   Group B
# 3 x-012   Group B
# 4 x-013   Group B
# 5 x-014   Group B
# 6 x-015   Group B
# 7 x-016   Group B
# 8 x-017   Group B
# 9 x-018   Group B
#10 x-019   Group B
# ... with 11 more rows

【讨论】:

  • 这适用于这个例子。但是,我意识到在我的实际数据中,主题前缀是字母和数字的组合,例如“xyz01-”,然后是主题编号。所以,我不能只提取数字。如何调整此代码以不仅提取所有数字,还提取:“-”之后的数字或最后 3 位数字?
  • @user42485 as.numeric(gsub( "^.+-", "", df$subject))
  • @akrun 没有意识到它并没有完全重现每个方面
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多