R:使用gsub和grep从文本列表中创建新数据框

问题描述 投票:0回答:1

如何从文本列表中提取重要信息-名称,年龄,(疾病)和体重-并创建新的数据列表或框架?

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"

HOWEVER,

无法将年龄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  

如果您只能部分回答,这也将有所帮助。谢谢。

如何从文本列表中提取重要信息-名称,年龄,(疾病)和体重-并创建新的数据列表或框架?测试

r dataframe text gsub
1个回答
2
投票
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        
© www.soinside.com 2019 - 2024. All rights reserved.