R: Создание нового фрейма данных из текстового списка с использованием gsub и grep - PullRequest
0 голосов
/ 24 марта 2020

Как я могу извлечь важную информацию - имя, возраст (болезнь) и вес - из текстового списка и создать новый список данных или фрейм?

test<-c("James is approximately age 25 & 26 weighted 130lbs", 
        "Angelina is age 40 (Diabetes)", 
        "Harry Peterson is male with ages 27")

Для этого

Я смог указать имена / и болезнь в скобках.

> sapply(strsplit(test, "\\s+"),"[",1)
[1] "James"    "Angelina" "Harry"

> gsub("[\\(\\)]","\\1", regmatches(test, gregexpr("(?<=\\().*?(?=\\))",test, perl=T)))
[1] "character0" "Diabetes"   "character0"

ОДНАКО, не удалось установить подмножество 25 и 26 лет, и grep 'ages'

> paste(grep(pattern="age",  trimws(strsplit(test, " ")[[1]]), value = TRUE),as.numeric(sub(".*age. 
(\\d+).*", "\\1", test[[1]])) )
[1] "age 25"

Как я могу извлечь все число и амперсанд вместе из текста? как "возраст 25 и 26"

Как я могу установить шаблон для возраста, который извлекает возраст и возраст? возраст 27 -> «возраст 27», взвешенный -> «вес 130»

Как я могу получить всю информацию в следующем порядке, вместо имен подмножеств, возрастов, веса и () отдельно?

 c("James","age 25 & 26", "weight 130", "Angelina","age 40", "Diabetes", "Harry", "age 27")

и в конечном итоге создайте фрейм данных, как показано ниже

          age        weight  illness   
James     "25 & 26"  "130"   NA        
Angelina  "40"       NA     "Diabetes"
Harry     "27"       NA      NA  

Если вы можете ответить только частично, что также будет полезно. Спасибо.

1 Ответ

2 голосов
/ 24 марта 2020
gsub(" .*", "", test)
# [1] "James"    "Angelina" "Harry"   

trimws(gsub("ages?", "", regmatches(test, gregexpr("ages?\\s*[-&0-9 ]+\\b", test, perl = TRUE))))
# [1] "25 & 26" "40"      "27"     

weights <- regmatches(test, gregexpr("weight(s|ed)? [0-9]+(lb|pound|kg|g)?", test))
weights[lengths(weights) < 1] <- NA_character_
trimws(gsub("weight(s|ed)?", "", unlist(weights)))
# [1] "130lb" NA      NA     

ill <- regmatches(test, gregexpr("(?<=\\().*(?=\\))", test, perl = TRUE))
ill[lengths(ill) < 1] <- NA_character_
unlist(ill)
# [1] NA         "Diabetes" NA        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...