Извлечь определенные числа из строки в R

У меня есть этот пример:

> exemplo
V1   V2
local::/raiz/diretorio/adminadmin/    1
local::/raiz/diretorio/jatai_p_user/    2
local::/raiz/diretorio/adminteste/    3
local::/raiz/diretorio/adminteste2/    4
local::/raiz/diretorio/48808032191/    5
local::/raiz/diretorio/85236250110/    6
local::/raiz/diretorio/92564593100/    7
local::/raiz/diretorio/AACB/036/03643936451/  331
home::22723200159 3894
home::98476963300 3895
home::15239136149 3896
home::01534562567 3897

Я хотел бы извлечь только числа с точными 11 символами (в первом столбце), получив такие результаты:

> exemplo
V1   V2
48808032191    5
85236250110    6
92564593100    7
03643936451   331
22723200159   3894
98476963300   3895
15239136149   3896
01534562567   3897

Любая помощь будет здорово :-)


person quelopes    schedule 21.01.2015    source источник
comment
Когда запись включает, скажем, 20-значное число, вам нужны только первые 11 цифр? Или вы хотите, чтобы он вообще не совпадал.   -  person Josh O'Brien    schedule 21.01.2015


Ответы (3)


Вот один из способов использования stringr, где d — ваш фрейм данных:

library(stringr)
m <- str_extract(d$V1, '\\d{11}')
na.omit(data.frame(V1=m, V2=d$V2))

#             V1   V2
# 5  48808032191    5
# 6  85236250110    6
# 7  92564593100    7
# 8  03643936451  331
# 9  22723200159 3894
# 10 98476963300 3895
# 11 15239136149 3896
# 12 01534562567 3897

Приведенный выше подход будет соответствовать строкам, состоящим не менее чем из 11 цифр. В ответ на комментарий @JoshO'Brien, если вы хотите сопоставить только точно 11 цифр, вы можете использовать:

m <- str_extract(d$V1, perl('(?<!\\d)\\d{11}(?!\\d)'))
person jbaums    schedule 21.01.2015

Вот как бы я подошел к этому. Это можно сделать в базе R, но согласованность именования stringi делает его настолько простым в использовании, не говоря уже о том, что он быстрый. Я бы сохранил 11 цифр как новый столбец, а не перезаписывал старый.

dat <- read.table(text="V1   V2
local::/raiz/diretorio/adminadmin/    1
local::/raiz/diretorio/jatai_p_user/    2
local::/raiz/diretorio/adminteste/    3
local::/raiz/diretorio/adminteste2/    4
local::/raiz/diretorio/48808032191/    5
local::/raiz/diretorio/85236250110/    6
local::/raiz/diretorio/92564593100/    7
local::/raiz/diretorio/AACB/036/03643936451/  331
home::22723200159 3894
home::98476963300 3895
home::15239136149 3896
home::01534562567 3897", header=TRUE)


library(stringi)
dat[["V3"]] <- unlist(stri_extract_all_regex(dat[["V1"]], "\\d{11}"))
dat[!is.na(dat[["V3"]]), 3:2]

##             V3   V2
## 5  48808032191    5
## 6  85236250110    6
## 7  92564593100    7
## 8  03643936451  331
## 9  22723200159 3894
## 10 98476963300 3895
## 11 15239136149 3896
## 12 01534562567 3897
person Tyler Rinker    schedule 21.01.2015

Команда, которую вы ищете, это grep(). Шаблон для использования будет что-то вроде \d{11} или [0-9]{11}.

person LauriK    schedule 21.01.2015