我有很多包含数字的字符串。其中一些字符串包含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个数字时,如何从字符串中提取最小值,并将数字作为数据帧中的列输出。
答案 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]
匹配字符串中的所有非数字。