【问题标题】:How to extract number from a column vector that start with a specifc number in R? [closed]如何从以 R 中的特定数字开头的列向量中提取数字? [关闭]
【发布时间】:2020-12-12 09:12:44
【问题描述】:

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

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                        

谁能帮我解决这个问题?

谢谢!

【问题讨论】:

    标签: r arrays string dataframe gsub


    【解决方案1】:

    我建议使用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"
    

    【讨论】:

    • @Rollo99 也谢谢你!好问题!
    【解决方案2】:

    这是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))
    

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2020-04-15
      • 2016-02-03
      • 2021-12-24
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2021-05-08
      • 2011-11-19
      相关资源
      最近更新 更多