str_match на основе вектора с проблемой количества - PullRequest
0 голосов
/ 28 апреля 2020

У меня нет изображения, но мои данные хранятся в CSV-файле

https://transcode.geo.data.gouv.fr/services/5e2a1fbefa4268bc25628f27/feature-types/drac: site? Format = CSV & projection = WGS84

library(readr)
bzh_sites <- read_csv("site.csv")

I хочу посчитать строку на основе сопоставления символов (столбец NATURE)

pattern<-c("allée|aqueduc|architecture|atelier|bas|carrière|caveau|chapelle|château|chemin|cimetière|coffre|dépôt|dolmen|eau|église|enceinte|enclos|éperon|espace|exploitation|fanum|ferme|funéraire|groupe|habitat|maison|manoir|menhir|monastère|motte|nécropole|occupation|organisation|parcellaire|pêcherie|prieuré|production|rue|sépulture|stèle|thermes|traitement|tumulus|villa")


 test2 <-  bzh_sites %>%
  drop_na(NATURE) %>%
   group_by(NATURE = str_match( NATURE, pattern )) %>%
   summarise(n = n())

дает мне:

NATURE  n
1   allée   176
2   aqueduc 73
3   architecture    68
4   atelier 200

И еще один тест с теми же данными (NATURE)

pattern <- c("allée|aqueduc|architecture|atelier")

test2 <-  bzh_sites %>%
 drop_na(NATURE) %>%
 group_by(NATURE = str_match( NATURE, pattern )) %>%
 summarise(n = n())

дает мне:

NATURE    n
1   allée   178
2   aqueduc 74
3   architecture    79
4   atelier 248

Я понятия не имею о различиях в числе.

1 Ответ

1 голос
/ 28 апреля 2020

Я попытался выяснить, где расхождение для первой группы, т.е. "allée". Вот что я нашел:

library(stringr)

pattern1<-c("allée|aqueduc|architecture|atelier|bas|carrière|caveau|chapelle|château|chemin|cimetière|coffre|dépôt|dolmen|eau|église|enceinte|enclos|éperon|espace|exploitation|fanum|ferme|funéraire|groupe|habitat|maison|manoir|menhir|monastère|motte|nécropole|occupation|organisation|parcellaire|pêcherie|prieuré|production|rue|sépulture|stèle|thermes|traitement|tumulus|villa")

#Get indices where 'allée' is found using pattern1
ind1 <- which(str_match(bzh_sites$NATURE, pattern1 )[, 1] == 'allée')

pattern2 <- c("allée|aqueduc|architecture|atelier")
#Get indices where 'allée' is found using pattern1
ind2 <- which(str_match(bzh_sites$NATURE, pattern2)[, 1] == 'allée')

#Indices which are present in ind2 but absent in ind1
setdiff(ind2, ind1)
#[1]  3093 10400

#Get corresponding text
temp <- bzh_sites$NATURE[setdiff(ind2, ind1)]
temp
#[1] "dolmen allée couverte"           "coffre funéraire allée couverte"

Что происходит, когда мы используем pattern1 и pattern2 на temp

str_match(temp, pattern1)
#         [,1]    
#[1,] "dolmen"
#[2,] "coffre"

str_match(temp, pattern2)

#       [,1]   
#[1,] "allée"
#[2,] "allée"

Как мы видим, используя pattern1 определенные значения классифицируются в другой группе, так как они встречаются первыми в строке, поэтому мы имеем несоответствие.

Аналогичное объяснение можно дать для несоответствий в других группах.


str_match возвращает только первое совпадение, чтобы получить все совпадения в шаблоне, которые мы можем использовать str_match_all

table(unlist(str_match_all(bzh_sites$NATURE, pattern1)))

#       allée      aqueduc architecture      atelier          bas 
#         178           76           79          252           62 
#    carrière       caveau     chapelle      château       chemin 
#          46           35          226          205          350 
#   cimetière       coffre        dépôt       dolmen          eau 
#         275          155          450          542          114 
#      église     enceinte       enclos       éperon       space 
#         360          655          338          114          102 
#exploitation        fanum        ferme    funéraire       groups 
#        1856           38          196         1256          295 
#     habitat       maison       manoir       menhir    monastère 
#        1154           65          161         1036           31 
#       motte    nécropole   occupation organisation  parcellaire 
#         566          312         5152           50          492 
#    pêcherie      prieuré   production          rue    sépulture 
#          69           66          334           44          152 
#       stèle      thermes   traitement      tumulus        villa 
#         651           50          119         1232          225 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...