Programim dhe zhvillim, javascript, python, php, html

Ndani vargun në disa kolona duke përdorur tidyr::extract regex

Po përpiqem të ndaj një vektor vargu në disa variabla duke përdorur shprehje të rregullta në R, mundësisht në një mënyrë dplyr-tidyr duke përdorur komandën tidyr::extract. Për shembull në vektorin e mëposhtëm:

sasdic <- data.frame(a=c(
  '@1   ANO_CENSO   5.  /*Ano do Censo*/',
  '@71  TP_SEXO $Char1. /*Sexo*/',
  '@72  TP_COR_RACA $Char1. /*Cor/raça*/',
  '@74  FK_COD_PAIS_ORIGEM  4.  /*Código País de origem*/' )) 

Unë do të doja për:

  • numri i parë ([0-9]+) për të shkuar te ndryshorja "int_pos"
  • emri i variablës i lidhur me nënvizim ([a-zA-Z_]+) për të shkuar te ndryshorja "var_name"
  • Numri i dytë ose termi $Char1 (mund të jetë $Char2, etj) për të shkuar në var "x". Kuptova ([0-9]+|$Char[0-9]+) a mund ta zgjidhte këtë?
  • Së fundi, çdo gjë që vjen në mes "/* ... /" për të shkuar te ndryshorja "label" (nuk e di regex për këtë). Të gjithë karakteret e tjera të ndërmjetme (hapësirat bosh, ".", "/", "" duhet të hiqen në konsideratë)

Ky do të ishte rezultati

d <- data.frame(int_pos=c(1,72,72,74),
                var_name=c('ANO_CENSO','TP_SEXO','TP_COR_RACA','FK_COD_PAIS_ORIGEM'),
                x=c('5','Chart1','$Char1','4'),
                label=c('Ano do Censo','Sexo','Cor/raça','Código País de origem') )

Unë u përpoqa të ndërtoj një shprehje të rregullt për këtë. Kjo është ajo që kam marrë deri tani:

sasdic %>% extract(a, c('int_pos','var_name','x','label'), 
                   "([0-9]+)([a-zA-Z_]+)([0-9]+|$Char[0-9]+)(something to get the label") 
             -> d

sipër shprehja e rregullt është e paplotë. Gjithashtu, nuk e di hot për të bërë të qartë në sintaksën e komandës ekstrakte, cilat janë pjesët që duhen rikuperuar dhe cilat janë pjesët për të lënë jashtë.

15.01.2016

Përgjigjet:


1

Në regex-in e përdorur, ne jemi duke përputhur një tjetër karaktere pikësimi ([[:punct:]]+) d.m.th. @ e ndjekur nga kapja e pjesës numerike ((\\d+) - kjo do të jetë kolona jonë e parë e interesit), e ndjekur nga një ose më shumë hapësira të bardha (\\s+), e ndjekur nga nga grupi i dytë i kapjes (\\S+ - një ose më shumë karaktere pa hapësirë ​​të bardhë, p.sh. "ANO_CENSO" për rreshtin e parë), e ndjekur nga hapësira (\\s+), më pas ne kapim grupin e tretë (([[:alum:]$]+) - d.m.th. një ose më shumë karaktere që përfshijnë alfa numerike së bashku me $ në mënyrë që të përputhet me $Char1), më pas përputhim një ose më shumë karaktere që nuk janë shkronjë ([^A-Za-z]+- kjo duhet të heqë hapësirën dhe *) dhe në pjesën e fundit kapim një ose më shumë karaktere që nuk janë * (([^*]+).

sasdic %>% 
      extract(a, into=c('int_pos', 'var_name', 'x', 'label'),
   "[[:punct:]](\\d+)\\s+(\\S+)\\s+([[:alnum:]$]+)[^A-Za-z]+([^*]+)")

#  int_pos           var_name      x                 label
#1       1          ANO_CENSO      5          Ano do Censo
#2      71            TP_SEXO $Char1                  Sexo
#3      72        TP_COR_RACA $Char1              Cor/raça
#4      74 FK_COD_PAIS_ORIGEM      4 Código País de origem
15.01.2016

2

Ky është një opsion tjetër, megjithëse përdor paketën data.table në vend të tidyr:

library(data.table)
setDT(sasdic)

# split label
sasdic[, c("V1","label") := tstrsplit(a, "/\\*|\\*/")]                   
# remove leading "@", split remaining parts
sasdic[, c("int_pos","var_name","x") := tstrsplit(gsub("^@","",V1)," +")]
# remove unneeded columns
sasdic[, c("a","V1") := NULL]                                            

sasdic

#                    label int_pos           var_name       x
# 1:          Ano do Censo       1          ANO_CENSO      5.
# 2:                  Sexo      71            TP_SEXO $Char1.
# 3:              Cor/raça      72        TP_COR_RACA $Char1.
# 4: Código País de origem      74 FK_COD_PAIS_ORIGEM      4.

Kjo supozon se "pjesët e mbetura" (përveç etiketës) janë të ndara në hapësirë.


Kjo mund të bëhet gjithashtu në një bllok (që është ajo që do të bëja):

sasdic[, c("a","label","int_pos","var_name","x") := {
  x   = tstrsplit(a, "/\\*|\\*/")
  x1s = tstrsplit(gsub("^@","",x[[1]])," +")
  c(list(NULL), x1s, x[2])
}]
15.01.2016

3

Ju mund të përdorni paketën unglue:

library(unglue)
unglue_unnest(sasdic, a, "@{int_pos}{=\\s+}{varname}{=\\s+}{x}.{=\\s+}/*{label}*/")
#>   int_pos            varname      x                       label
#> 1       1          ANO_CENSO      5                Ano do Censo
#> 2      71            TP_SEXO $Char1                        Sexo
#> 3      72        TP_COR_RACA $Char1                 Cor/ra<e7>a
#> 4      74 FK_COD_PAIS_ORIGEM      4 C<f3>digo Pa<ed>s de origem
08.10.2019
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..