Извлечь несколько частей строки, используя R - PullRequest
0 голосов
/ 29 января 2019

Я продолжаю пытаться скомпилировать выражение, которое извлечет из следующих данных:

  [4] "00010131 DistanceToPith=15.0; YearsToPith=3; Radius=50.128; CalcRadius=Yes; "  
  [5] "00010131 PithCoordinates=60.919,6.071; SiteId=KO31; "                          
  [6] "00010131 Location=Djerdap, GJ \"Kožica\" odeljenje 31; State=Srbija; "         
  [7] "00010131 SpeciesCode=QUPE; SpeciesName=Kitnjak, Quercus petrea; "              
  [8] "00010131 Personal_ID=Marko Kazimirovic; DateOfSampling=jesen 2013; "           
  [9] "00010131 Name=00010131; Written=2018-05-04 16:53:09; "                         
 [10] "00010131 EarthCoord=E 44 35 N 21 58; Elev=450-465; "                           
 [11] "00010131 Project=Radakovicev magistarski; "                                    
 [12] "00010132 DistanceToPith=6.7; YearsToPith=3; Radius=104.927; CalcRadius=Yes; "  
 [13] "00010132 PithCoordinates=108.974,27.022; Written=2018-05-04 17:09:35; "        
 [14] "00010132 SiteId=KO31; Location=Djerdap, GJ \"Kožica\" odeljenje 31; "          
 [15] "00010132 EarthCoord=E 44 35 N 21 58; Elev=450-465; State=Srbija; "             
 [16] "00010132 SpeciesCode=QUPE; SpeciesName=Kitnjak, Quercus petrea; "              
 [17] "00010132 Project=Radakovicev magistarski; Personal_ID=Marko Kazimirovic; "     
 [18] "00010132 DateOfSampling=jesen 2013; Name=00010132; "   

только первые восемь чисел

(^\\d{8}), (YearsToPith=\\d+;)) and (Radius=\\d+;) 

и ничего больше.

Помимо этого, я ищу советы и ссылки, где можно найти исчерпывающую литературу по регулярному выражению на R, поскольку область применения руководств, на которые я смотрел, была довольно узкой, ограничиваясь только объяснением основ с помощью довольномного простых примеров.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Я понимаю, что вам нужен восьмизначный идентификатор, за которым следует текст, содержащий значения YearsToPith и Radius.

Попробуйте этот Perl

$ perl -ne ' @x=$_=~m/\S+\s"(\S+)\s+.+?YearsToPith=(\d+).+\s+Radius=(\S+)/ ; print "$x[0] $x[1] $x[2]\n" if (@x) ' marko.txt
00010131 3 50.128;
00010132 3 104.927;

$
0 голосов
/ 29 января 2019

Вывод gregexpr с группами захвата в pattern и perl=TRUE имеет атрибуты "capture.start" и "capture.length", которые дают вам индексы на входе, соответствующие вашему шаблону.

ind <- lapply(gregexpr(PATTERN, INPUT, perl=TRUE),
     function(r) rbind(attr(r,"capture.start"),
                       attr(r,"capture.length")-1))
OUPTUT <- t(sapply(1:length(input), function(i) 
    apply(ind[[i]],2, function(y) substr(input[i],y[1],y[1]+y[2]))))

На ваш вход с

PATTERN <- "^(\\d{8}).*(YearsToPith=\\d+;).*(Radius=[\\d\\.]+;)"

вывод:

 [1,] "00010131" "YearsToPith=3;" "Radius=50.128;" 
 [2,] ""         ""               ""               
 [3,] ""         ""               ""               
 [4,] ""         ""               ""               
 [5,] ""         ""               ""               
 [6,] ""         ""               ""               
 [7,] ""         ""               ""               
 [8,] ""         ""               ""               
 [9,] "00010132" "YearsToPith=3;" "Radius=104.927;"
[10,] ""         ""               ""               
[11,] ""         ""               ""               
[12,] ""         ""               ""               
[13,] ""         ""               ""               
[14,] ""         ""               ""               
[15,] ""         ""               ""               
0 голосов
/ 29 января 2019
library(stringr)
res<-sapply(str_split(s," "),"[")[c(2,4,5)]
str_remove_all(res,"(\\D(?=\\d{4,}))")
[1] "00010131"       "YearsToPith=3;" "Radius=50.128;"

Минус слова:

res1<-str_remove_all(res,"(\\D(?=\\d{4,}))")
str_remove(res1,"\\w{3,}=")
[1] "00010131" "3;"       "50.128;"

Только первые восемь цифр:

str_extract_all(s,"\\d{8,}(?=\\s)")
[[1]]
[1] "00010131"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...