我有一个变量,它的值如下:

example <- c("positive_1", "positive_2", "test_20_curve", "test_60_point", "percent_total")

有没有办法只返回向量中的"20"和"60"?

我目前有

gsub(".*([0-9]{2}).*", "\\1", example)

哪一项输出

[1] "positive_1"    "positive_2"    "20"            "60"            "percent_total"

我想知道是否有一种方法可以使任何没有两位数的值都显示为NA.

提前谢谢!

推荐答案

stringr::str_extract approach

您可以使用

example <- c("positive_1", "positive_2", "test_20_curve", "test_60_point", "percent_total")
library(stringr)
str_extract(example, "(?<!\\d)\\d{2}(?!\\d)")
## => [1] NA   NA   "20" "60" NA  

请看R demo.Note:str_extract提取模式的first个匹配项.如果您需要最后一个,请使用library(stringi),然后使用stri_extract_last_regex(example, "(?<!\\d)\\d{2}(?!\\d)").

Details:

  • (?<!\d)-紧靠左侧,不能有数字
  • \d{2} -两位数
  • (?!\d)--后面不会紧跟另一个数字.

sub approach

example <- c("positive_1", "positive_2", "test_20_curve", "test_60_point", "percent_total")
res <- sub("^(?:(?:.*\\D)?(\\d{2})(?:\\D.*)?|.+)$", "\\1", example)
res <- res[nzchar(res)]
res
## => [1] "20" "60"

请看R demo.

Pattern details

  • ^-字符串的开始
  • (?: - either of the two alternatives:
    • |.+)
    • (?:.*\D)?-任意非数字字符的可选序列,然后是字符串的其余部分
    • (\d{2})-第一组(替换图案中的\1指值):两位
    • (?:\D.*)?-任意非数字字符的可选序列,然后是字符串的其余部分
  • | - or
    • .+-尽可能多地使用一个或多个字符
  • )-外部分组的末尾(以便任一模式部分可以匹配整个字符串)
  • $-字符串末尾.

sub在这里就足够了,因为我们在匹配整个字符串时执行一次替换.

如果字符串中没有只有两位数的数字,则sub的结果将是空字符串,所以我们需要使用res <- res[nzchar(res)]来go 掉它们.

NOTE:如果两位数字多次出现,则使用此方法返回最后一个.要获得第一个,请使用sub("^(?:(?:.*?\\D)?(\\d{2})(?:\\D.*)?|.+)$", "\\1", example, perl=TRUE).

R相关问答推荐

为什么predicate.lm给出的是一个长度与我解析的数据集不同的载体?

feature_weights参数没有影响Xgboost

逐行替代引用前一行的for循环

R数据帧中的布尔加法会产生布尔值而不是整值

R通过字符串中的索引连接数据帧r

在水平条形图中zoom x_轴

变量计算按R中的行更改

在R底座中更改白天和夜晚的背景 colored颜色

在位置周围设定一个半径并识别该半径内的其他位置

MCMC和零事件二元逻辑回归

通过使用str_detect对具有相似字符串的组进行分组

在组中添加值增加和减少的行

在不丢失空值的情况下取消列出嵌套列表

使用R中的dist()迭代ID匹配的欧几里德距离

正则表达式在第二个管道和第二个T之后拆分R中的列

按两个因素将观测值分组后计算单独的百分比

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

如何移动点以使它们的打印不重叠

如何使投篮在R中保持一致