如何从 R 中以特定数字开头的列向量中提取数字?

How to extract number from a column vector that start with a specifc number in R?

我有一个如下所示的列向量:

df = c("338 3598662 geom  Dr ssa Filippoli Antonella Offida", "338 3192000  Assess UDC  Pagnotta Fab figlio del macellaio", 
"patente 1955  802671", "339 3562299    ricciotti anna rita", 
"338 7785393   lavora Asl    Ancona lorenzo ", "388 1823261  fav  X PMA 2020", 
"320 1953005 clarinetto x banda  Boccucci Giuseppe ", "339 2277465    figlia Pizzeria", 
"338 5864740    pat  09  disp   Portato da AngeliniMarino DP", 
"802231 – 329 7258802  Radiologia osp  AP", "320 8463884  cena con Casini Parco dei Tigli 2012", 
"336632    328 9176396    tess  UDC", "339 2518167  conosco   Ausil Osp  AP", 
"348 3744913    ex Porta Cartara", "Ostetrica 802671   333 7162562", 
"801315 – 329 8503536", "Parco dei Tigli   335 6881024", "338 9676808     ASL", 
"t reaz   804795 – 335 8250301 UDC     Edoardo Sabatini", "802297 – 377 1716992  Cisl – Rosandra ", 
"Inf  ADI   801267 – 339 6922610", "damig  800153   333 2532715", 
"amb  802846       339 2394346", "802748    338 3820058", "335 5626261    commercialista", 
"800033  suocera Maravalle Sandro votato         09", "338 4038818", 
"320 3868728 ex badante separata 2 figli  sussidi reg  2011 ", 
"802252 – 328 7290148  inf   Medic  Nucl ", "065601309    335 6773371", 
"800031   UDC  320 3928056     Figlio Alessio  Coop  ADI", "Concorso OSS al Torrette  Amica di Capriotti Romina ", 
"338 3792238    Preside", "335 6496206   moglie Buccuccia  UDC", 
"393 0975047  amica fb", "335 5419889     provveditorato Asl       ipovisus ", 
"1980 pat  2010     392 1122000", "Alfonsi Pierluigi  339 3562299 pres  Coop  Croce Verde", 
"patente 1963  802122", "807177  349 5014291 distr milit  Agriturismo Laga Nord Umito 804888", 
"amm vo ASL  802118  338 7515902     Eleonora  sestiere", "Assist  Parlam  Gianrusso 5 Stelle    padre 329 0209450 ", 
"802201 – 349 0733923     Lovascio Ilenia 346 8406225", "338 9775434   Pres  Banda", 
"328 6528146 sussidi familiari 2012     MOGLIE", "334 1443641   pat  1958      carina", 
"338 4033254     tipografia       e figlie", "339 3131266  bando nuova impr     BAR Pinco Panco", 
"Inf  ADI  333 2106288", "44675    338 9966710      UDC   Edoardo Sabatini"
)

 [1] "338 3598662 geom  Dr ssa Filippoli Antonella Offida"                
 [2] "338 3192000  Assess UDC  Pagnotta Fab figlio del macellaio"         
 [3] "patente 1955  802671"                                               
 [4] "339 3562299    ricciotti anna rita"                                 
 [5] "338 7785393   lavora Asl    Ancona lorenzo "                        
 [6] "388 1823261  fav  X PMA 2020"                                       
 [7] "320 1953005 clarinetto x banda  Boccucci Giuseppe "                 
 [8] "339 2277465    figlia Pizzeria"                                     
 [9] "338 5864740    pat  09  disp   Portato da AngeliniMarino DP"        
[10] "802231 – 329 7258802  Radiologia osp  AP"                           
[11] "320 8463884  cena con Casini Parco dei Tigli 2012"                  
[12] "336632    328 9176396    tess  UDC"                                 
[13] "339 2518167  conosco   Ausil Osp  AP"                               
[14] "348 3744913    ex Porta Cartara"                                    
[15] "Ostetrica 802671   333 7162562"                                     
[16] "801315 – 329 8503536"                                               
[17] "Parco dei Tigli   335 6881024"                                      
[18] "338 9676808     ASL"                                                
[19] "t reaz   804795 – 335 8250301 UDC     Edoardo Sabatini"             
[20] "802297 – 377 1716992  Cisl – Rosandra "                             
[21] "Inf  ADI   801267 – 339 6922610"                                    
[22] "damig  800153   333 2532715"                                        
[23] "amb  802846       339 2394346"                                      
[24] "802748    338 3820058"                                              
[25] "335 5626261    commercialista"                                      
[26] "800033  suocera Maravalle Sandro votato         09"                 
[27] "338 4038818"                                                        
[28] "320 3868728 ex badante separata 2 figli  sussidi reg  2011 "        
[29] "802252 – 328 7290148  inf   Medic  Nucl "                           
[30] "065601309    335 6773371"                                           
[31] "800031   UDC  320 3928056     Figlio Alessio  Coop  ADI"            
[32] "Concorso OSS al Torrette  Amica di Capriotti Romina "               
[33] "338 3792238    Preside"                                             
[34] "335 6496206   moglie Buccuccia  UDC"                                
[35] "393 0975047  amica fb"                                              
[36] "335 5419889     provveditorato Asl       ipovisus "                 
[37] "1980 pat  2010     392 1122000"                                     
[38] "Alfonsi Pierluigi  339 3562299 pres  Coop  Croce Verde"             
[39] "patente 1963  802122"                                               
[40] "807177  349 5014291 distr milit  Agriturismo Laga Nord Umito 804888"
[41] "amm vo ASL  802118  338 7515902     Eleonora  sestiere"             
[42] "Assist  Parlam  Gianrusso 5 Stelle    padre 329 0209450 "           
[43] "802201 – 349 0733923     Lovascio Ilenia 346 8406225"               
[44] "338 9775434   Pres  Banda"                                          
[45] "328 6528146 sussidi familiari 2012     MOGLIE"                      
[46] "334 1443641   pat  1958      carina"                                
[47] "338 4033254     tipografia       e figlie"                          
[48] "339 3131266  bando nuova impr     BAR Pinco Panco"                  
[49] "Inf  ADI  333 2106288"                                              
[50] "44675    338 9966710      UDC   Edoardo Sabatini"   

我想做的不仅仅是保留数字(在这种情况下我会知道怎么做),而是只保留以 3 开头且总共有 12 位数字的数字。

例如,只取前 10 行,我想得到:

 [1] "3383598662"                
 [2] "3383192000"         
 [4] "3393562299"                                 
 [5] "3387785393"                        
 [6] "3881823261"                                       
 [7] "3201953005"                 
 [8] "3392277465"                                     
 [9] "3385864740        
[10] "3297258802"     

# the third row is gone since it didn't start with 3 and had less than 12 digits                        

谁能帮我解决这个问题?

谢谢!

我建议使用 gdata 函数 startsWith() 的下一种方法来检测以 3 开头的字符串,然后格式化这些值以获得所需的数字。我已经调整了代码以获得与所示输出类似的输出,但您可以根据需要进行更改。我使用了你的 df 数据:

library(gdata)
#First select all strings that start with 3
nvec <- df[startsWith(df,'3')]
#Split
nvec2 <- do.call(c,lapply(nvec,function(x) strsplit(x,split=' ')[[1]][1]))
#Remove
nvec2 <- nvec2[which(nchar(nvec2)>=11)]
#Format
nvec2 <- gsub('.','',nvec2,fixed=T)

输出:

nvec2
 [1] "3383598662" "3383192000" "3393562299" "3387785393" "3881823261" "3201953005" "3392277465" "3385864740"
 [9] "3208463884" "3483744913" "3389676808" "3355626261" "3203868728" "3383792238" "3356496206" "3930975047"
[17] "3355419889" "3389775434" "3286528146" "3341443641" "3384033254" "3393131266"

这是一个tidyverse方法。

library(dplyr)
library(stringr)
df <- data.frame(d = df)
df %>% mutate(d = as.numeric(str_remove(str_extract(d, "\d{3} \d{7}" ), " " ))) %>%
   filter(!is.na(d))