2016-09-09 16 views
5

Mam strukturę bazy danych - wersja skrócona poniżejWyciąganie dopasowanych słów z ciągiem

structure(list(sex1 = c("totalmaleglobal", "totalfemaleglobal", 
"totalglobal", "totalfemaleGSK", "totalfemaleglobal", 
"totalfemaleUN")), .Names = "sex1", row.names = c(NA, 6L), 
class="data.frame") 

Chcę, aby wyodrębnić słowa „całkowity”, „totalmale”, „totalfemale”

Jak to zrobić ?

Próbowałem regex z następującego kodu

pattern1=c("total") 
pattern2=c("totalmale") 
pattern3=c("totalfemale") 

daly$sex <- str_extract(daly$sex1,pattern1) 
daly$sex <- str_extract(daly$sex1,pattern2) 
daly$sex <- str_extract(daly$sex1,pattern3) 

ale jego dając mi na.

+0

Cóż, można uzyskać na przykład 'NA' gdzie' pattern3' nie pasuje. Tak więc jedną z opcji byłoby użycie 'daly $ sex [! Is.na (daly $ sex)]' z drugiego rzędu. (Np. 'Daly $ sex [! Is.na (daly $ sex)] <- str_extract (daly $ sex1! Is.na (daly $ sex)], wzorzec2)') – lukeA

+2

Myślę, że twój opis nie jest jasny jako 'total 'również dopasowuje' totalmale' i 'totalfemale' i nie ma pojedynczego wystąpienia samego' total' w kolumnie. Czy wyświetlasz oczekiwany wynik? – akrun

Odpowiedz

2

Może

library(stringr) 
daly$sex <- str_extract(daly$sex1,paste(rev(mget(ls(pattern = "pattern\\d+"))), collapse="|")) 
daly 
#    sex1   sex 
# 1 totalmaleglobal totalmale 
# 2 totalfemaleglobal totalfemale 
# 3  totalglobal  total 
# 4 totalfemaleGSK totalfemale 
# 5 totalfemaleglobal totalfemale 
# 6  totalfemaleUN totalfemale 
+0

wielkie dzięki - dlaczego odwracasz wzór. Czy to dlatego nie działa? – user3919790

+3

wzorzec 3 jest dłuższy i zawiera wzorzec 2 jako początkowy podciąg. To samo dotyczy wzoru 2 i wzoru 1. Jeśli ich nie odwrócisz, nie otrzymasz dłuższych alternatyw, ponieważ nie są zakotwiczone na obu końcach. –

2

Dwa kroki z gsub,

v2 <- gsub(paste(v1, collapse='|'), '', d1$sex1) 

gsub(paste(v2, collapse='|'), '', d1$sex1) 
#[1] "totalmale" "totalfemale" "total"  "totalfemale" "totalfemale" "totalfemale" 

gdzie

v1 <- c('total', 'totalmale', 'totalfemale') 
1

spróbuj tego:

test = structure(list(sex1 = c("totalmaleglobal", "totalfemaleglobal", 
        "totalglobal", "totalfemaleGSK", "totalfemaleglobal", 
        "totalfemaleUN")), .Names = "sex1", row.names = c(NA, 6L), 
        class="data.frame") 

total = grep("total", test[[1]], perl=TRUE, value=TRUE) 
totalmale = grep("totalmale", test[[1]], perl=TRUE, value=TRUE) 
totalfemale = grep("totalfemale", test[[1]], perl=TRUE, value=TRUE) 

print(total) 
print(totalmale) 
print(totalfemale) 
0

Mogliśmy również nie sapply i grepl (w podstawowej R) nad poszukiwanych wzorców (s1 wektor) w następujący sposób:

x <- sapply(s1,function(x) grepl(x, d1$sex1)) 
colnames(x)[max.col(x, ties.method = "first")] 

# [1] "totalmale" "totalfemale" "total" "totalfemale" "totalfemale" "totalfemale" 

gdzie

s1 <- c("totalmale", "totalfemale", "total")