在字符串向量中查找最大数字

时间:2016-05-24 15:12:49

标签: r

我有一个带有以下信息的载体:

"CCP--TODAS(00)--MAMOLGUR (20151015)-**16**.txt"
"CCP--TODAS(00)--MAMOLGUR (20151015)-**4**.txt"

正如我们所看到的,向量中的这两个元素都有数字和字符,所以我想要做的是获得最大数字(只有粗体数字),元素结构不会改变,只是数字会改变

任何人都知道如何解决这个问题?

此示例的结果应为16。

1 个答案:

答案 0 :(得分:0)

如果@ gopala的解释是正确的,并且您想要.txt之前的最大数字,则以下gsub函数会将其解除:

temp <- c("CCP--TODAS(00)--MAMOLGUR (20151015)-16.txt", 
          "CCP--TODAS(00)--MAMOLGUR (20151015)-4.txt")

max(as.numeric(gsub("^.*-([0-9]+)\\.txt$", "\\1", temp)))

以下是解决方案的组成部分:

  • max功能不言自明
  • as.numeric将一个参数(通常是一个向量)强制转换为数字类型,我们将其输入max

解决方案的内容是gsub,它采用正则表达式(她,&#34; ^。* - ([0-9] +)\ .txt $&#34;),a替换字符串(此处为&#34; \ 1&#34;)和字符串向量。

正则表达式&#34; ^。 - ([0-9] +)\。txt $&#34;说&#34; ^&#34;从一开始,&#34;。&#34;匹配任何东西到&#34; - &#34;一个连字符。 &#34;()&#34;捕获[0-9] +数字,0到9,完全匹配&#34; .txt&#34;最后&#34; $&#34;。 &#34; \&#34;是一个逃脱,并告诉正则表达式引擎治疗&#34;。&#34;作为文字点,而不是开头的任何字符。

替换&#34; \ 1&#34;说返回第一个被捕获的&#34;()&#34;子表达式,这是我们的数字,&#34; [0-9] +&#34;。

正则表达式是许多软件中可用的神奇工具,这是我最喜欢的regex site

如果向量包含的元素与模式不匹配,并且您想忽略它们,则可以将na.rm参数添加到max,如下所示:

temp <- c("CCP--TODAS(00)--MAMOLGUR (20151015)-16.txt", 
          "CCP--TODAS(00)--MAMOLGUR (20151015)-4.txt",
          "PPS--TODAS--MAMOLGUR 20151128-116 -Cuba y San Jose")

max(as.numeric(gsub("^.*-([0-9]+)\\.txt$", "\\1", temp)), na.rm=T)

这会产生关于缺失值的警告,但仍会返回正确答案。