当该字符串中的数字超过1时,从字符串中提取最小值

时间:2017-03-10 20:42:06

标签: r regex

我有很多包含数字的字符串。其中一些字符串包含2个这样的数字:

library(tidyverse)
df1 <- data.frame(x ="Want to extract both values 7 + 8",
                  y = "var")

我对该字符串中的最小数字感兴趣,但我在提取时遇到问题,因为我一直在列表列中结束,并且不知道如何继续。我的理想输出是:

> df1
                                  x   y comp_num  firstnum  secondnum
1 Want to extract both values 7 + 8 var     7, 8         7          8

以下是我如何提取数字:

df1$comp_num = regmatches(df1$x,gregexpr('[0-9]+',df1$x))

然后我最终得到一个列表专栏。这是我到目前为止所尝试的:

df1$unnestval <- tidyr::unnest(df1$comp_num)

df1$separ <- tidyr::separate(df1$comp_num)

df1$unlistval <- unlist(df1$comp_num)

我遇到的问题是列表列,但仅仅是因为这是我的方法结束的地方。中心问题是当字符串中有多于1个数字时,如何从字符串中提取最小值,并将数字作为数据帧中的列输出。

1 个答案:

答案 0 :(得分:1)

如果您愿意切换到data.table,这可能有所帮助。

library(data.table)
DT <- data.table(C1=replicate(5, paste0(sample(LETTERS, 2), sample(1:9,2), collapse = "")))
DT
     C1
1: Y7J6
2: J8O5
3: M4G6
4: I5Q9
5: T3M1

## Extracting Digits
DT[ , C2:=lapply(C1, function(x){ gsub("[^\\d]", "", x, perl = T) }), by=C1]

## Extracting Min Value
DT[, C3:=lapply(C2, function(x){min(as.integer(unlist(strsplit(x, ""))))}), by=C1]

## Extracting Max Value
DT[, C4:=lapply(C2, function(x){max(as.integer(unlist(strsplit(x, ""))))}), by=C1]
DT
     C1 C2 C3 C4
1: Y7J6 76  6  7
2: J8O5 85  5  8
3: M4G6 46  4  6
4: I5Q9 59  5  9
5: T3M1 31  1  3

请注意,正则表达式[^\\d]匹配字符串中的所有非数字。