Как разделить эти ингредиенты, которые сопровождаются различным количеством сокращений в скобках - PullRequest
1 голос
/ 05 апреля 2020

Вот выдержка из моих данных:

"глифосат (HB C), атразин (HB C), метамат калия (FUN, HB C, INS, NEM ), дихлорпропен (HB C, NEM), метолахлор (-ы) (HB C), хлороталонил (FUN), хлорпикрин (NEM), bacillus amyloliquifacien (FUN), 2,4-d (HB C) , PGR) "

Я хочу, чтобы этот пример выглядел так:

Split data

Я знаю все возможные сокращения (HB C, FUN et c) если это поможет.

Это то, что я пробовал до сих пор.

str = "glyphosate (HBC), atrazine (HBC), dichloropropene (HBC, NEM), metolachlor(-s) (HBC), chlorothalonil (FUN), chloropicrin (NEM), bacillus amyloliquifacien (FUN), 2,4-d (HBC, PGR), pendimethalin (HBC), metam (FUN, HBC, INS, NEM), acetochlor (HBC), metribuzin (HBC), dicamba (HBC), phorate (INS), chlorpyrifos (ACA, INS), flutolanil (FUN), paraquat (HBC), propazine (HBC), dimethenamid(-p) (HBC, FUN), bromoxynil (HBC)"

vec = unlist(unlist(strsplit(str, " ()")))
vec_clean = gsub('^\\(|\\),|\\,|)$', '', vec)

matrix(vec_clean,nrow = 24,ncol = 2, byrow = TRUE)

Что дает мне:

> matrix(vec_clean,nrow = 24,ncol = 2, byrow = TRUE)
      [,1]               [,2]             
 [1,] "glyphosate"       "HBC"            
 [2,] "atrazine"         "HBC"            
 [3,] "dichloropropene"  "HBC"            
 [4,] "NEM"              "metolachlor(-s" 
 [5,] "HBC"              "chlorothalonil" 
 [6,] "FUN"              "chloropicrin"   
 [7,] "NEM"              "bacillus"       
 [8,] "amyloliquifacien" "FUN"            
 [9,] "24-d"             "HBC"            
[10,] "PGR"              "pendimethalin"  
[11,] "HBC"              "metam"          
[12,] "FUN"              "HBC"            
[13,] "INS"              "NEM"            
[14,] "acetochlor"       "HBC"            
[15,] "metribuzin"       "HBC"            
[16,] "dicamba"          "HBC"            
[17,] "phorate"          "INS"            
[18,] "chlorpyrifos"     "ACA"            
[19,] "INS"              "flutolanil"     
[20,] "FUN"              "paraquat"       
[21,] "HBC"              "propazine"      
[22,] "HBC"              "dimethenamid(-p"
[23,] "HBC"              "FUN"            
[24,] "bromoxynil"       "HBC" 

Аргумент, который я использую в str split "()", был вызван методом проб и ошибок, и я не совсем понимаю, почему это работает в некоторой степени. Я попытался удалить ведущий и конечный "(" и ",)", используя пример, который я изменил отсюда: условно удалить начальный или конечный символ `.` в R

Так что это начало, но когда ингредиент имеет больше сокращений, например (FUN, HB C et c), он также разбивает его там. Он также удаляет "," из 2,4-го числа и между сокращениями, чего не должно быть. Он удаляет завершающий знак ")" из диметенамида (-p), который также не должен.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Вот базовое решение R:

str = "glyphosate (HBC), atrazine (HBC), dichloropropene (HBC, NEM), metolachlor(-s) (HBC), chlorothalonil (FUN), chloropicrin (NEM), bacillus amyloliquifacien (FUN), 2,4-d (HBC, PGR), pendimethalin (HBC), metam (FUN, HBC, INS, NEM), acetochlor (HBC), metribuzin (HBC), dicamba (HBC), phorate (INS), chlorpyrifos (ACA, INS), flutolanil (FUN), paraquat (HBC), propazine (HBC), dimethenamid(-p) (HBC, FUN), bromoxynil (HBC)"
out <- strsplit(str, "(?<=\\)), ", perl=TRUE)[[1]]
out <- strsplit(out, "( \\()|(\\)$)", perl=TRUE)
do.call(rbind, out)
#>       [,1]                        [,2]                
#>  [1,] "glyphosate"                "HBC"               
#>  [2,] "atrazine"                  "HBC"               
#>  [3,] "dichloropropene"           "HBC, NEM"          
#>  [4,] "metolachlor(-s)"           "HBC"               
#>  [5,] "chlorothalonil"            "FUN"               
#>  [6,] "chloropicrin"              "NEM"               
#>  [7,] "bacillus amyloliquifacien" "FUN"               
#>  [8,] "2,4-d"                     "HBC, PGR"          
#>  [9,] "pendimethalin"             "HBC"               
#> [10,] "metam"                     "FUN, HBC, INS, NEM"
#> [11,] "acetochlor"                "HBC"               
#> [12,] "metribuzin"                "HBC"               
#> [13,] "dicamba"                   "HBC"               
#> [14,] "phorate"                   "INS"               
#> [15,] "chlorpyrifos"              "ACA, INS"          
#> [16,] "flutolanil"                "FUN"               
#> [17,] "paraquat"                  "HBC"               
#> [18,] "propazine"                 "HBC"               
#> [19,] "dimethenamid(-p)"          "HBC, FUN"          
#> [20,] "bromoxynil"                "HBC"

Создано в 2020-04-05 пакетом Представить (v0.3.0)

0 голосов
/ 05 апреля 2020

Используя stringr::str_match_all

stringr::str_match_all(str, ",?\\s?(.*?)\\s\\((.*?)\\),")[[1]][, -1]

#       [,1]                        [,2]                
# [1,] "glyphosate"                "HBC"               
# [2,] "atrazine"                  "HBC"               
# [3,] "dichloropropene"           "HBC, NEM"          
# [4,] "metolachlor(-s)"           "HBC"               
# [5,] "chlorothalonil"            "FUN"               
# [6,] "chloropicrin"              "NEM"               
# [7,] "bacillus amyloliquifacien" "FUN"               
# [8,] "2,4-d"                     "HBC, PGR"          
# [9,] "pendimethalin"             "HBC"               
#[10,] "metam"                     "FUN, HBC, INS, NEM"
#[11,] "acetochlor"                "HBC"               
#[12,] "metribuzin"                "HBC"               
#[13,] "dicamba"                   "HBC"               
#[14,] "phorate"                   "INS"               
#[15,] "chlorpyrifos"              "ACA, INS"          
#[16,] "flutolanil"                "FUN"               
#[17,] "paraquat"                  "HBC"               
#[18,] "propazine"                 "HBC"               
#[19,] "dimethenamid(-p)"          "HBC, FUN"   

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...