如何从 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))
我有一个如下所示的列向量:
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))